当前位置: 首页 > 知识库问答 >
问题:

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

养研
2023-03-14

以前,我问如何在Flask请求中接收数据,因为request.data是空的。答案解释说request.data是原始的文章主体,但是如果分析表单数据,它将是空的。如何才能无条件获得生帖体?

@app.route('/', methods=['POST'])
def parse_request():
    data = request.data  # empty in some cases
    # always need raw data here, not parsed form data

共有3个答案

咸昀
2023-03-14

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

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

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

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)
request.environ['body_copy']
堵鸿光
2023-03-14

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

data = request.stream.read()

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

楮阳
2023-03-14

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

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

 类似资料:
  • 问题内容: 根据php手册或php:// input都不能与POST请求一起使用。 “ php:// input允许您读取原始的POST数据。它是内存占用较少的替代方法,并且不需要任何特殊的php.ini指令。php:// input不适用于。” 如何获取表格的原始数据? 问题答案: 直接回答:你不能那样做。只要PHP看到multipart / form-data Content- Type,它就

  • 问题内容: 以前,我问过如何获取Flask请求中的数据,因为它是空的。答案解释为原始帖子正文,但如果分析表单数据将为空。我如何无条件获得原始职位? 问题答案: 使用获得的原始数据,而不管内容类型。该数据被缓存,你可以随后访问随意。 如果你首先访问,它将首先调用一个参数以解析表单数据。如果请求具有形式的内容类型(,或),则原始数据将被消耗。并且在这种情况下将显示为空。

  • 我觉得这个问题有一个非常简单的解决方案。但是,在尝试解决了大约3个小时未果后,我谦卑地来找你。 一个自定义的帖子类型,乐队,已经创建,并有几个自定义字段(这是通过高级自定义字段插件创建的。) 我将如何获得和显示的内容(特别是自定义字段数据)的特定带条目(使用其ID或标题或段塞)内的一个常规的帖子?(见下图) 我们必须提供ID/title/slug,以便它知道要显示的band post的内容 短代码

  • 我的Rest控制器 我的异常处理无效的原始 json 帖子。我尝试使用请求。 IllegalStateException:已经为此请求调用了getInputStream() 我想在这个异常上保留日志输入原始json数据。 有人能帮我吗?谢谢。 更新 作为@Sean Carrol的建议。我尝试按照建议使用HttpServletRequest estWrapper,但它仍然不起作用。 我在InputS

  • 我正在开发一个wordpress插件。我使用两种不同的自定义帖子类型,球员和球队。 玩家有相关的元字段:名字、姓氏和团队。 团队有相关的团队名称元字段。 在编辑一个特定的团队帖子时,我试图将当前拥有该团队名称的所有球员的数组发布到他们的元字段中以获取团队名称。我不知道怎么做。任何帮助或文章都会很有帮助。谢啦

  • 我仍然没有发现正在发生的事情,但以下是我目前发现并做的事情: 1)log4j.xml文件格式不正确:缺少DOCTYPE,有多个布局,某些布局类不正确。 2)我已在命令行中指定了log4j.xml文件的路径;3)对DOMConfigurator和PropertyConfigurator的几次调用,我已将它们删除。 我将研究范围缩小到一个基于线程ID创建动态日志文件的类。在执行该类中的代码之前,log