Як отримати різні частини URL-адреси запиту на колбу?


144

Я хочу виявити, чи запит надходив від хосту localhost:5000або foo.herokuapp.comхост і який шлях запитувався. Як мені отримати цю інформацію про колбу?

Відповіді:


235

Ви можете вивчити URL за допомогою декількох Requestполів :

Користувач запитує таку 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?
Вадим

4
@Vadim Ви повинні використовувати request.root_url, а не Request.root_url.
самозавантаження

1
Новачок у Flask, я не знав, звідки береться
Ulysse 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/
moto

171

ще один приклад:

запит:

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
Це чудова відповідь. Дуже корисно і повно.
Дао Starbow

10

ви повинні спробувати:

request.url 

Він, мабуть, працює завжди, навіть на localhost (щойно це зробив).


1

Якщо ви використовуєте Python, я б запропонував, вивчивши об’єкт запиту:

dir(request)

Оскільки об'єкт підтримує метод dict :

request.__dict__

Його можна роздрукувати або зберегти. Я використовую його для реєстрації 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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.