Как получить разные части URL-адреса запроса Flask?


144

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

Ответы:


236

Вы можете просмотреть 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_urlhttp://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
Это должен быть принятый ответ, так как в нем гораздо больше деталей.
Пфабри

1
Это отличный ответ. Очень полезно и полно.
Тао Старбоу

10

Ты должен попытаться:

request.url 

Предполагается, что работать всегда, даже на localhost (только что сделал).


1

Если вы используете Python, я бы посоветовал изучить объект запроса:

dir(request)

Поскольку объект поддерживает метод dict :

request.__dict__

Это может быть напечатано или сохранено. Я использую его для регистрации 404 кодов в Flask:

@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.