如何在Flask中获取HTTP头?

318
使用Flask,我怎样读取HTTP头部信息?我想要检查客户端发送的授权头部信息。

2
相关:如何使用Flask获取用户代理? - Martijn Pieters
1
此外,请参阅 Flask QuickstartAPI documentation - Martijn Pieters
4个回答

480
from flask import request
request.headers.get('your-header-name')

request.headers的行为类似于字典,因此您可以像访问任何字典一样获取您的头信息:

request.headers的行为类似于字典,因此您可以像访问任何字典一样获取您的头信息:

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

12
FYI:我正在查看http://flask.pocoo.org/snippets/8/,似乎您也可以通过以下方式访问基本身份验证的用户名和密码:`request.authorization.username`或`request.authorization.password`。 - Karthic Raghupathi
2
只要标题没有像破折号这样的非法字符(例如X-Api-Key),您就可以像使用键一样访问它,@Karthic Raghupathi。 - Blairg23
1
@Abhijeet:...或者你可以直接使用我在之前评论中建议的代码。更加简洁。 - Michael Scheper
7
Flask的标头不是字典,对吧?...在我的测试中,我看到它们作为werkzeug.datastructures.EnvironHeaders返回。 http://werkzeug.pocoo.org/docs/0.14/datastructures/#werkzeug.datastructures.EnvironHeaders - Pandem1c
1
@MichaelScheper,get函数的第二个参数似乎是多余的,因为我相信None是默认值。 - holdenweb
显示剩余7条评论

40

如果有人试图获取传递的所有标头,则只需简单地使用:

dict(request.headers)
它会将所有的标题作为字典返回,你可以根据需要进行任何操作。在我的使用案例中,我必须将所有标题转发到另一个 API,因为 Python API 是代理。

4
这不是真的。request.headers 实际上是一个 EnvironHeaders 对象,可以像字典一样访问。https://werkzeug.palletsprojects.com/en/1.0.x/datastructures/#werkzeug.datastructures.EnvironHeaders - jasonrhaas
1
尽管@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)) - Tim Ludwinski
@TimLudwinski 你可能缺乏上下文。有一条已删除的评论声称 request.headers 的类型将是 dict,因为它可以像dict一样访问/查询。你看到的评论是对那个评论的回应。 - iam.Carrot

39

请注意,这些方法之间的区别在于如果标题不存在

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']
   ....

3
这是 Python 映射类的默认行为。 - ribitskiyb

12
让我们看看如何在Flask中获取参数、头部和请求体。 我将借助Postman来解释。

enter image description here

参数的键和值在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

在参数之后,现在让我们来看一下如何获取头部信息

enter image description here

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

现在让我们看看如何获取正文

enter image description here

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

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

这些截图中的程序是什么? - Zach Lagden
1
@LUNA 那是Postman - https://www.postman.com/ - Rayanth
太棒了,谢谢! - Zach Lagden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接