首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python Flask中获取原始POST正文,而不考虑Content-Type标头

在Python Flask中获取原始POST正文,而不考虑Content-Type标头
EN

Stack Overflow用户
提问于 2012-06-12 23:37:11
回答 4查看 157.3K关注 0票数 149

之前,我问How to get data received in Flask request是因为request.data是空的。答案解释说,request.data是原始的post主体,但如果解析表单数据,它将为空。如何才能无条件地获取原始的帖子正文?

代码语言:javascript
复制
@app.route('/', methods=['POST'])
def parse_request():
    data = request.data  # empty in some cases
    # always need raw data here, not parsed form data
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-05-28 05:06:58

使用request.get_data()获取原始数据,而不考虑内容类型。数据被缓存,您随后可以随意访问request.datarequest.jsonrequest.form

如果您首先访问request.data,它将首先使用一个参数调用get_data来解析表单数据。如果请求具有表单内容类型(multipart/form-dataapplication/x-www-form-urlencodedapplication/x-url-encoded),则将使用原始数据。在这种情况下,request.datarequest.json将显示为空。

票数 247
EN

Stack Overflow用户

发布于 2012-06-13 00:25:25

request.stream是由WSGI服务器传递给应用程序的原始数据流。读取它时不会进行解析,尽管您通常会使用request.get_data()

代码语言:javascript
复制
data = request.stream.read()

如果流之前被request.data或其他属性读取,则流将为空。

票数 40
EN

Stack Overflow用户

发布于 2012-06-23 04:29:43

我创建了一个WSGI中间件来存储来自environ['wsgi.input']流的原始正文。我将值保存在WSGI环境中,这样我就可以在我的应用程序中从request.environ['body_copy']访问它。

这在Werkzeug或Flask中不是必需的,因为无论内容类型如何,request.get_data()都将获得原始数据,但可以更好地处理HTTP和WSGI行为。

这会将整个正文读取到内存中,这将是一个问题,例如,如果发布了一个大文件。如果Content-Length头丢失,它将不会读取任何内容,因此它不会处理流请求。

代码语言:javascript
复制
from io import BytesIO

class WSGICopyBody(object):
    def __init__(self, application):
        self.application = application

    def __call__(self, environ, start_response):
        length = int(environ.get('CONTENT_LENGTH') or 0)
        body = environ['wsgi.input'].read(length)
        environ['body_copy'] = body
        # replace the stream since it was exhausted by read()
        environ['wsgi.input'] = BytesIO(body)
        return self.application(environ, start_response)

app.wsgi_app = WSGICopyBody(app.wsgi_app)
代码语言:javascript
复制
request.environ['body_copy']
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10999990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档