如何获取 Flask 请求的 url 的不同部分?

Posted

技术标签:

【中文标题】如何获取 Flask 请求的 url 的不同部分?【英文标题】:How do I get the different parts of a Flask request's url? 【发布时间】:2013-04-05 04:18:51 【问题描述】:

我想检测请求是否来自localhost:5000foo.herokuapp.com 主机以及请求的路径。如何获取有关 Flask 请求的信息?

【问题讨论】:

【参考方案1】:

您可以通过多个Request 字段检查网址:

假设您的应用程序正在侦听以下应用程序根目录:

http://www.example.com/myapplication

并且用户请求以下 URI:

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

在这种情况下,上述属性的值如下:

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

您可以通过适当的拆分轻松提取主机部分。

【讨论】:

我想得到Request.root_url,作为回报,我只得到<werkzeug.utils.cached_property object>,而不是格式很好的http://www.example.com/myapplication/。或者这个功能在 localhost 上不起作用? @Vadim 你应该使用 request.root_url,而不是 Request.root_url。 Flask 新手,我不知道请求对象来自哪里以及它是如何工作的,这里是:flask.pocoo.org/docs/0.12/reqcontext request.url_root 对我有用,而 request.root_url 和 Request.root_url 失败。因此,请注意 cap 'R' 和 url_root 与 root_url url_root 返回http://www.example.com/ 而不是http://www.example.com/myapplication/ base_url 返回http://www.example.com/myapplication/【参考方案2】:

如果您使用的是 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')

【讨论】:

【参考方案3】:

另一个例子:

请求:

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

【讨论】:

这应该是公认的答案,因为它有更多的细节。 这是一个很好的答案。非常有用且完整。 想使用request.full_path的朋友,建议改用request.environ['RAW_URI']。因为,当实际的完整查询路径为/alert/dingding/test时,request.full_path返回/alert/dingding/test?,结果会多加一个问号,这可能是不可取的。 谢谢!这些详细的信息帮助很大。真的很感激。 这是一个很棒且非常详细的答案【参考方案4】:

你应该试试:

request.url 

它应该一直工作,即使在本地主机上(刚刚做到了)。

【讨论】:

以上是关于如何获取 Flask 请求的 url 的不同部分?的主要内容,如果未能解决你的问题,请参考以下文章

Flask没有从jQuery请求数据中获取任何数据

如何获取 Flask 请求 JSON 数据作为字典?

flask中通过request获取请求的url信息

如何根据请求的 URL 的域在 Flask 中路由?

flask怎么获取请求报头信息

在 java 中,如何查找连接为获取 URL 的所有部分而发出的请求数?