Jak uzyskać różne części adresu URL żądania Flask?

144

Chcę wykryć, czy żądanie pochodzi z hosta localhost:5000lub foo.herokuapp.comi jaką ścieżkę zażądano. Jak uzyskać te informacje o żądaniu usługi Flask?

Dogukan Tufekci
źródło

Odpowiedzi:

235

Możesz sprawdzić adres URL za pomocą kilku Requestpól :

Użytkownik żąda następującego adresu URL:

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

W takim przypadku wartości wyżej wymienionych atrybutów byłyby następujące:

    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/

Możesz łatwo wyodrębnić część nadrzędną za pomocą odpowiednich podziałów.

przestępczość lodowa
źródło
5
Próbuję uzyskać Request.root_urli jako zwrot otrzymuję tylko <werkzeug.utils.cached_property object>zamiast ładnie sformatowanego http://www.example.com/myapplication/. Lub ta funkcja nie działa na hoście lokalnym?
Vadim
4
@Vadim Należy użyć request.root_url, a nie Request.root_url.
Selfboot
1
nowy w Flask, nie wiedziałem, skąd pochodzi obiekt żądania i jak działa, oto jest: flask.pocoo.org/docs/0.12/reqcontext
Ulysse BN
3
request.url_root działa dla mnie, podczas gdy request.root_url i Request.root_url zawodzą. Dlatego uważaj na czapkę „R” i url_root w porównaniu z root_url
zerocog
url_root http://www.example.com/nie zwraca http://www.example.com/myapplication/ base_urlhttp://www.example.com/myapplication/
moto
171

inny przykład:

żądanie:

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

następnie:

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
źródło
4
To powinna być akceptowana odpowiedź, ponieważ zawiera dużo więcej szczegółów.
pfabri
1
To świetna odpowiedź. Bardzo przydatne i kompletne.
Tao Starbow
10

powinieneś spróbować:

request.url 

Powinien działać zawsze, nawet na hoście lokalnym (właśnie to zrobił).

Biegł
źródło
1

Jeśli używasz Pythona, proponuję zbadać obiekt żądania:

dir(request)

Ponieważ obiekt obsługuje dyktowanie metody :

request.__dict__

Można go wydrukować lub zapisać. Używam go do logowania 404 kodów w Flasku:

@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
źródło