How to get http headers in flask?
我是python的新手,使用Python Flask并生成REST API服务。
我想检查发送给客户端的授权标头。
但是我找不到在flask中获取HTTP标头的方法。
感谢获得HTTP标头授权的任何帮助。
-
相关:如何获得Flask的用户代理?
-
另外,请参见Flask快速入门和API文档。
1 2
| from flask import request
request.headers.get('your-header-name') |
request.headers的行为类似于字典,因此您也可以像使用任何字典一样获取标头:
1
| request.headers['your-header-name'] |
-
感谢您的快速帮助@sanyi
-
request.headers.get(authorization)有效!
-
仅供参考:我正在查看flask.pocoo.org/snippets/8,看来您还可以访问用户名和密码以进行基本身份验证,例如:request.authorization.username或request.authorization.password。
-
@Karthic Raghupathi,只要标头没有破折号之类的非法字符,大多数标头都会使用破折号(即X-Api-Key),在这种情况下,您需要像带键的字典一样访问它。
-
在代码中添加if hasattr(request, authorization):将有助于检查请求中缺少的授权属性。
-
@Abhijeet:似乎并非总是如此。当我使用curl而不指定授权标头时,hasattr(request, authorization)返回True,但是getattr(request, authorization)返回None。我不确定这是否是Im使用中间件或框架的结果(例如,Flask-Restful)。
-
@MichaelScheper可能使用in运算符检查可能会有所帮助,它对我if authorization in request:有用,in运算符的其他用法
-
@Abhijeet:再次,它检查密钥是否存在,但不检查值是否存在。一种更安全的方法是if request.headers.get(your-header-name, None)-仅当your-header-name存在且值不为null时,此方法才会通过。
-
@MichaelScheper多数民众赞成在一个事实,逻辑需要很少条件一起照顾Non-Existence & None value,即if headers in request and request.header is not None and authorization in request.headers and request.headers[authorization] is not None:
-
@Abhijeet:...或者您可以只使用我先前评论中建议的代码。清洁得多。
-
Flask标头不是字典,是吗?...我在测试中看到它们以werkzeug.datastructures.EnvironHeaders的形式返回。 werkzeug.pocoo.org/docs/0.14/datastructures/
-
@MichaelScheper get的第二个参数似乎是多余的,因为我相信None是默认值。
-
@holdenweb:谢谢,您是对的。我认为第二个参数对于防止KeyError是必需的,但这仅对request.headers[your-header-name]正确。 (我应该知道。)但是自从我看过这已经有一段时间了,所以我不确定这是否解决了阿比耶耶特斯和潘迪姆斯的担忧。
-
我都不是-只是在您的知识储备中添加了另一个橡子。
请注意,如果标头不存在,则方法之间的区别是
1
| request.headers.get('your-header-name') |
将返回None或没有异常,因此您可以像这样使用它
1 2
| if request.headers.get('your-header-name'):
.... |
但是以下内容将引发错误
1 2
| if request.headers['your-header-name'] # KeyError: 'your-header-name'
.... |
你可以通过
1 2 3
| if 'your-header-name' in request.headers:
customHeader = request.headers['your-header-name']
.... |
如果有人试图获取所有已传递的标头,则只需使用:
它为您提供了dict中的所有标头,您实际上可以从中执行任何想要的操作。 在我的用例中,由于python API是代理,因此我不得不将所有标头转发到另一个API