【问题标题】:How to get http headers in flask?如何在烧瓶中获取http标头?
【发布时间】:2015-06-05 21:01:22
【问题描述】:

我是 python 新手,使用 Python Flask 并生成 REST API 服务。

我想检查发送给客户端的授权标头。

但我找不到在烧瓶中获取 HTTP 标头的方法。

感谢任何有关获得 HTTP 标头授权的帮助。

【问题讨论】:

标签: python http flask http-headers authorization


【解决方案1】:
from flask import request
request.headers.get('your-header-name')

request.headers 的行为类似于字典,因此您也可以像使用任何字典一样获取标题:

request.headers['your-header-name']

【讨论】:

  • 仅供参考:我正在查看 flask.pocoo.org/snippets/8,看来您还可以访问基本身份验证的用户名和密码,如下所示:request.authorization.usernamerequest.authorization.password
  • @Karthic Raghupathi,只要标题没有像破折号这样的非法字符,大多数标题都有(即 X-Api-Key),在这种情况下,您需要像访问它一样访问它带键的字典。
  • 在代码中添加if hasattr(request, 'authorization'): 将有助于检查请求中是否缺少“授权”属性。
  • @Abhijeet: ...或者您可以使用我在之前评论中建议的代码。干净多了。
  • Flask 标头不是字典,是吗?...我看到它们在我的测试中以 werkzeug.datastructures.EnvironHeaders 的形式出现。 werkzeug.pocoo.org/docs/0.14/datastructures/…
【解决方案2】:

请注意,方法之间的不同是,如果标头不存在

request.headers.get('your-header-name')

将返回None 或者没有异常,所以你可以像这样使用它

if request.headers.get('your-header-name'):
    ....

但是下面会报错

if request.headers['your-header-name'] # KeyError: 'your-header-name'
    ....

你可以通过

if 'your-header-name' in request.headers:
   customHeader = request.headers['your-header-name']
   ....

【讨论】:

  • 这是 Python 的默认映射类行为
【解决方案3】:

如果有人试图获取所有通过的标头,那么只需使用:

dict(request.headers)

它为您提供 dict 中的所有标题,您可以从中实际执行任何您想做的操作。在我的用例中,我不得不将所有标头转发到另一个 API,因为 python API 是一个代理

【讨论】:

  • @JamieLindsey 这不是真的。 request.headers 实际上是一个EnvironHeaders 对象,可以像字典一样访问。 werkzeug.palletsprojects.com/en/1.0.x/datastructures/…
  • 虽然@jasonrhass 在大多数情况下是正确的,但EnvironHeaders 不是dict 的子类,所以它会失败很多次,而dict 会成功(isinstance(flask.request.headers, dict) == False)。例如,以下代码会产生错误:print(json.dumps(flask.request.headers, indent=4))。修复是print(json.dumps(dict(flask.request.headers), indent=4))
  • @TimLudwinski 您可能错过了上下文。有一条已删除的评论声称request.headers 的类型为dict,因为它可以像dict 一样被访问/查询。您看到的评论是对此的回应。
【解决方案4】:

让我们看看我们如何在 Flask 中获取参数、标题和正文。 我会在邮递员的帮助下解释。

参数键和值反映在 API 端点中。 例如端点中的 key1key2https://127.0.0.1/upload?key1=value1&key2=value2

from flask import Flask, request
app = Flask(__name__)

@app.route('/upload')
def upload():

    key_1 = request.args.get('key1')
    key_2 = request.args.get('key2')
    print(key_1)
    #--> value1
    print(key_2)
    #--> value2

在params之后,我们现在看看如何获​​取headers

header_1 = request.headers.get('header1')
header_2 = request.headers.get('header2')
print(header_1)
#--> header_value1
print(header_2)
#--> header_value2

现在让我们看看如何获​​取body

file_name = request.files['file'].filename
ref_id = request.form['referenceId']
print(ref_id)
#--> WWB9838yb3r47484

所以我们使用 request.files 获取上传的文件并使用 request.form 获取文本

【讨论】:

  • 截图中的程序是什么?
  • @LUNA 是邮递员 - postman.com
  • 太棒了,谢谢!
猜你喜欢
  • 2017-05-09
  • 2015-10-11
  • 2020-08-09
  • 2019-01-16
  • 2017-11-05
  • 2012-10-25
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多