Wie erhalte ich die verschiedenen Teile der URL einer Flask-Anfrage?

142

Ich möchte feststellen, ob die Anfrage vom localhost:5000oder foo.herokuapp.comHost kam und welcher Pfad angefordert wurde. Wie erhalte ich diese Informationen zu einer Flaschenanfrage?

Dogukan Tufekci
quelle

Antworten:

235

Sie können die URL in mehreren RequestFeldern überprüfen :

Ein Benutzer fordert die folgende URL an:

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

In diesem Fall wären die Werte der oben genannten Attribute wie folgt:

    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/

Sie können den Host-Teil einfach mit den entsprechenden Teilungen extrahieren.

Eiskriminalität
quelle
5
Ich versuche zu bekommen Request.root_urlund als Gegenleistung bekomme ich nur <werkzeug.utils.cached_property object>statt schön formatiert http://www.example.com/myapplication/. Oder funktioniert diese Funktion auf localhost nicht?
Vadim
4
@Vadim Sie sollten request.root_url verwenden, nicht Request.root_url.
Selbststart
1
Neu bei Flask, ich wusste nicht, woher das Anforderungsobjekt kommt und wie es funktioniert. Hier ist es: flask.pocoo.org/docs/0.12/reqcontext
Ulysse BN
3
request.url_root funktioniert für mich, während request.root_url und Request.root_url fehlschlagen. Achten Sie daher auf die Kappe 'R' und url_root versus root_url
zerocog
url_root gibt http://www.example.com/nicht http://www.example.com/myapplication/ base_url zurückhttp://www.example.com/myapplication/
moto
170

ein anderes Beispiel:

Anfrage:

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

dann:

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
Chason
quelle
4
Dies sollte die akzeptierte Antwort sein, da sie viel detaillierter ist.
Pfabri
1
Dies ist eine großartige Antwort. Sehr nützlich und vollständig.
Tao Starbow
10

du solltest es versuchen:

request.url 

Es wird angenommen, dass immer gearbeitet wird, auch auf localhost (hat es einfach getan).

Ran
quelle
1

Wenn Sie Python verwenden, würde ich vorschlagen, das Anforderungsobjekt zu untersuchen:

dir(request)

Da das Objekt die Methode dict unterstützt :

request.__dict__

Es kann gedruckt oder gespeichert werden. Ich verwende es, um 404 Codes in Flask zu protokollieren:

@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')
Antonio
quelle