如何在烧瓶中获取http标头?

emi*_*mil 161 python authorization http http-headers flask

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

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

但我无法找到获取HTTP标头的方法.

任何有关获取HTTP标头授权的帮助都表示赞赏.

san*_*nyi 241

from flask import request
request.headers.get('your-header-name')
Run Code Online (Sandbox Code Playgroud)

request.headers 表现得像一个字典,所以你也可以像任何字典一样得到你的标题:

request.headers['your-header-name']
Run Code Online (Sandbox Code Playgroud)

  • FYI:我看http://flask.pocoo.org/snippets/8/,看来你也可以访问该用户名和密码基本认证,像这样:`request.authorization.username`或`request.authorization .password`. (8认同)
  • Flask标题不是dict,是吗?...我看到它们在我的测试中作为werkzeug.datastructures.EnvironHeaders回来了.http://werkzeug.pocoo.org/docs/0.14/datastructures/#werkzeug.datastructures.EnvironHeaders (4认同)
  • @Karthic Raghupathi,只要标头不包含破折号等非法字符,大多数标头都会这样做(即 X-Api-Key),在这种情况下,您需要像带键的字典一样访问它。 (2认同)

iam*_*rot 19

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

dict(request.headers)
Run Code Online (Sandbox Code Playgroud)

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

  • @JamieLindsey 这不是真的。`request.headers` 实际上是一个 `EnvironHeaders` 对象,可以像字典一样访问。https://werkzeug.palletsprojects.com/en/1.0.x/datastructs/#werkzeug.datastructs.EnvironHeaders (3认同)

Aje*_*rma 11

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

在此输入图像描述

参数键和值反映在 API 端点中。例如端点中的 key1key2 :https://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
Run Code Online (Sandbox Code Playgroud)

参数之后,现在让我们看看如何获​​取标头

在此输入图像描述

header_1 = request.headers.get('header1')
header_2 = request.headers.get('header2')
print(header_1)
#--> header_value1
print(header_2)
#--> header_value2
Run Code Online (Sandbox Code Playgroud)

现在让我们看看如何获​​得身体

在此输入图像描述

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

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


cie*_*ung 10

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

request.headers.get('your-header-name')
Run Code Online (Sandbox Code Playgroud)

将返回None或没有异常,因此您可以像使用它

if request.headers.get('your-header-name'):
    ....
Run Code Online (Sandbox Code Playgroud)

但是以下内容将引发错误

if request.headers['your-header-name'] # KeyError: 'your-header-name'
    ....
Run Code Online (Sandbox Code Playgroud)

你可以通过

if 'your-header-name' in request.headers:
   customHeader = request.headers['your-header-name']
   ....
Run Code Online (Sandbox Code Playgroud)

  • 这是 Python 的默认映射类行为 (2认同)