Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Python Flask中的原始帖子正文,而不考虑内容类型标题_Python_Flask_Werkzeug - Fatal编程技术网

获取Python Flask中的原始帖子正文,而不考虑内容类型标题

获取Python Flask中的原始帖子正文,而不考虑内容类型标题,python,flask,werkzeug,Python,Flask,Werkzeug,之前,我问是因为request.data是空的。答案解释说,request.data是原始的post主体,但如果解析表单数据,则将为空。我怎样才能无条件获得原始邮件正文 @app.route('/', methods=['POST']) def parse_request(): data = request.data # empty in some cases # always need raw data here, not parsed form data 是WSGI服务器

之前,我问是因为
request.data
是空的。答案解释说,
request.data
是原始的post主体,但如果解析表单数据,则将为空。我怎样才能无条件获得原始邮件正文

@app.route('/', methods=['POST'])
def parse_request():
    data = request.data  # empty in some cases
    # always need raw data here, not parsed form data
是WSGI服务器传递给应用程序的原始数据流。虽然您通常需要
请求,但在读取数据时不会进行解析。请改为获取数据()

data = request.stream.read()
如果先前由
请求读取,则流将为空。数据
或其他属性。

是WSGI服务器传递给应用程序的原始数据流。虽然您通常需要
请求,但在读取数据时不会进行解析。请改为获取数据()

data = request.stream.read()

如果流之前由
请求.data
或其他属性读取,则该流将为空。

我创建了一个WSGI中间件,用于存储
环境['WSGI.input']
流中的原始主体。我将该值保存在WSGI环境中,以便可以从我的应用程序中的
request.environ['body\u copy']
访问它

这在Werkzeug或Flask中是不必要的,因为
请求。get_data()
将获取原始数据,而不管内容类型如何,但可以更好地处理HTTP和WSGI行为

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

从io导入字节io
类WSGICopyBody(对象):
定义初始化(自身,应用程序):
self.application=应用程序
定义呼叫(自我、环境、启动响应):
长度=int(环境获取('CONTENT_length')或0)
body=environ['wsgi.input'].read(长度)
环境['body_copy']=body
#替换流,因为它已被read()耗尽
环境['wsgi.input']=BytesIO(正文)
返回self.application(环境、启动和响应)
app.wsgi_app=WSGICopyBody(app.wsgi_app)
request.environ['body\u copy']

我创建了一个WSGI中间件,用于存储来自
环境['WSGI.input']
流的原始主体。我将该值保存在WSGI环境中,以便可以从我的应用程序中的
request.environ['body\u copy']
访问它

这在Werkzeug或Flask中是不必要的,因为
请求。get_data()
将获取原始数据,而不管内容类型如何,但可以更好地处理HTTP和WSGI行为

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

从io导入字节io
类WSGICopyBody(对象):
定义初始化(自身,应用程序):
self.application=应用程序
定义呼叫(自我、环境、启动响应):
长度=int(环境获取('CONTENT_length')或0)
body=environ['wsgi.input'].read(长度)
环境['body_copy']=body
#替换流,因为它已被read()耗尽
环境['wsgi.input']=BytesIO(正文)
返回self.application(环境、启动和响应)
app.wsgi_app=WSGICopyBody(app.wsgi_app)
request.environ['body\u copy']
用于获取原始数据,无论内容类型如何。数据被缓存,随后您可以随意访问
request.data
request.json
request.form

如果您首先访问
request.data
,它将调用
get\u data
,并使用一个参数首先解析表单数据。如果请求具有表单内容类型(
multipart/form data
application/x-www-form-urlencoded
,或
application/x-url-encoded
),则原始数据将被消耗<在这种情况下,code>request.data
request.json
将显示为空。

用于获取原始数据,而不管内容类型如何。数据被缓存,随后您可以随意访问
request.data
request.json
request.form


如果您首先访问
request.data
,它将调用
get\u data
,并使用一个参数首先解析表单数据。如果请求具有表单内容类型(
multipart/form data
application/x-www-form-urlencoded
,或
application/x-url-encoded
),则原始数据将被消耗
request.data
request.json
在这种情况下将显示为空。

request.data
请求时将为空。标头[“Content Type”]
被识别为表单数据,将解析为
request.form
。要获取原始数据而不考虑内容类型,请使用
request.get_data()


request.data
调用
request.get\u data(parse\u form\u data=True)
,这会导致表单数据的不同行为。

request.data
如果
request.header[“Content Type”]
被识别为表单数据,将解析为
request.form
。要获取原始数据而不考虑内容类型,请使用
request.get_data()


request.data
调用
request.get\u data(parse\u form\u data=True)
,这会导致表单数据的不同行为。

在使用raven python(Sentry)时,这似乎会中断,这里有bug和解决方法:谢谢。这真的挽救了这一天。当您需要手动解析原始请求数据时,这是必需的。特别是当请求是multipart/form-data时。使用raven python(Sentry)、bug和解决方法时,这似乎会中断:谢谢。这真的挽救了这一天。当您需要手动解析原始请求数据时,这是必需的。特别是当请求是multipart/form-data时。感谢您指出,如果之前读取request.data,则流将为空!调试的时候差点把我搞定谢谢你的p