FlaskリクエストのURLのさまざまな部分を取得するにはどうすればよいですか?


143

リクエストがlocalhost:5000またはfoo.herokuapp.comホストからのものか、どのパスがリクエストされたかを検出したいと思います。Flaskリクエストに関するこの情報を取得するにはどうすればよいですか?

回答:


235

あなたはいくつかのRequestフィールドを通してURLを調べることができます

ユーザーが次のURLをリクエストします。

    http://www.example.com/myapplication/page.html?x=y

この場合、上記の属性の値は次のようになります。

    path             /page.html
    script_root      /myapplication
    base_url         http://www.example.com/myapplication/page.html
    url              http://www.example.com/myapplication/page.html?x=y
    url_root         http://www.example.com/myapplication/

ホストパーツは適切な分割で簡単に抽出できます。


5
私は取得しようとしていますがRequest.root_url<werkzeug.utils.cached_property object>適切にフォーマットされてhttp://www.example.com/myapplication/いるのではなく、結果としてのみ返されます。または、この機能はlocalhostでは機能しませんか?
Vadim 2016年

4
@Vadim Request.root_urlではなく、request.root_urlを使用する必要があります。
2016

1
:requestオブジェクトから来て、それがどのように動作するか、ここでそれがどこにあるフラスコに新しいが、私は知りませんでしたflask.pocoo.org/docs/0.12/reqcontext
ユリスBN

3
request.url_rootは私にとっては機能しますが、request.root_urlとRequest.root_urlは失敗します。したがって、キャップ「R」とurl_rootとroot_urlの比較
zerocog

url_root戻りhttp://www.example.com/ませんhttp://www.example.com/myapplication/ BASE_URLリターンhttp://www.example.com/myapplication/
モト

170

もう一つの例:

リクエスト:

curl -XGET http://127.0.0.1:5000/alert/dingding/test?x=y

次に:

request.method:              GET
request.url:                 http://127.0.0.1:5000/alert/dingding/test?x=y
request.base_url:            http://127.0.0.1:5000/alert/dingding/test
request.url_charset:         utf-8
request.url_root:            http://127.0.0.1:5000/
str(request.url_rule):       /alert/dingding/test
request.host_url:            http://127.0.0.1:5000/
request.host:                127.0.0.1:5000
request.script_root:
request.path:                /alert/dingding/test
request.full_path:           /alert/dingding/test?x=y

request.args:                ImmutableMultiDict([('x', 'y')])
request.args.get('x'):       y

4
より詳細な説明があるため、これは受け入れられる答えになるはずです。
pfabri

1
これは素晴らしい答えです。非常に便利で完全です。
Tao Starbow

10

試してみてください:

request.url 

localhostでも常に機能することを想定しています(やっただけです)。


1

Pythonを使用している場合は、リクエストオブジェクトを探索することをお勧めします。

dir(request)

オブジェクトはメソッドdictをサポートしているので:

request.__dict__

印刷または保存できます。私はそれを使ってFlaskに404コードを記録します:

@app.errorhandler(404)
def not_found(e):
    with open("./404.csv", "a") as f:
        f.write(f'{datetime.datetime.now()},{request.__dict__}\n')
    return send_file('static/images/Darknet-404-Page-Concept.png', mimetype='image/png')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.