无论 Content-Type 标头是什么,都可以在 Python Flask 中获取原始 POST 正文

2025-03-11 08:54:00
admin
原创
69
摘要:问题描述:之前我问过如何获取 Flask 请求中收到的数据,因为request.data数据为空。答案解释说这request.data是原始帖子主体,但如果解析表单数据,则为空。我如何无条件地获取原始帖子主体?@app.route('/', methods=['POST']) def parse_reques...

问题描述:

之前我问过如何获取 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

解决方案 1:

用于request.get_data()获取原始数据,无论内容类型如何。数据被缓存,您随后可以随意访问request.datarequest.json、 。request.form

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

解决方案 2:

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

data = request.stream.read()

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

解决方案 3:

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

这在 Werkzeug 或 Flask 中不是必需的,因为request.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']

解决方案 4:

request.data`request.headers["Content-Type"]如果被识别为表单数据,则为空,将被解析为request.form。要获取原始数据(无论内容类型如何),请使用request.get_data()`。

request.data调用request.get_data(parse_form_data=True),这会导致表单数据的行为不同。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2772  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1702  
  在企业的产品研发与管理过程中,混合敏捷开发模式正逐渐成为主流。这种开发模式融合了多种开发方法的优势,旨在更高效地应对复杂多变的项目需求。而PLM项目管理平台作为企业产品全生命周期管理的重要工具,如何有效支持混合敏捷开发,成为众多企业关注的焦点。通过整合五大关键框架,PLM项目管理平台能够为混合敏捷开发提供强大的支撑,助...
PLM软件   5  
  PLM(产品生命周期管理)合规性审计在确保企业产品符合行业标准方面起着至关重要的作用。随着市场竞争的加剧和法规要求的日益严格,企业必须高度重视PLM合规性,通过有效的审计来保障产品从设计到报废的整个生命周期都能满足相关标准。本文将从流程、数据和人员三大维度深入探讨如何确保PLM合规性审计的有效实施,助力行业标准落地。流...
plm项目管理软件   5  
  PLM(产品生命周期管理)系统在现代企业的产品研发与管理中扮演着至关重要的角色。随着企业业务的不断拓展和产品的日益复杂,实现模块化开发成为提升PLM系统灵活性、可扩展性和维护性的关键。模块化开发能够将复杂的系统分解为多个相对独立、功能明确的模块,使得开发过程更加高效,不同模块之间的协同更加顺畅,也便于后续的升级与优化。...
国内plm系统排名   3  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用