bigywater.tech
Flask · 34

request.args、request.form、request.json

数据从哪里读:args、form、json、data、values 到底有什么区别?GET 能带正文吗?PUT 的表单会被解析吗?这篇用一个视图和 12 种请求做出一张对照表。

12
本篇对照的请求种类数
415
request.json 遇到非 JSON 正文时的状态码
args 在前
request.values 合并时的顺序

12 种请求对照

实测 · 本机执行输出
  GET ?a=1           → 200 args={'a': '1'} form={} files=[] json='UnsupportedMediaType' data='' values={'a': '1'}
  GET + JSON 正文      → 200 args={} form={} files=[] json={'j': 1} data='{"j": 1}' values={}
  GET + 表单正文         → 200 args={} form={'f': '1'} files=[] json='UnsupportedMediaType' data='' values={}
  POST 表单            → 200 args={} form={'f': '1'} files=[] json='UnsupportedMediaType' data='' values={'f': '1'}
  POST ?a=1 + 表单     → 200 args={'a': '1'} form={'f': '1'} files=[] json='UnsupportedMediaType' data='' values={'a': '1', 'f': '1'}
  POST JSON          → 200 args={} form={} files=[] json={'j': 1} data='{"j": 1}' values={}
  POST ?a=1 + JSON   → 200 args={'a': '1'} form={} files=[] json={'j': 1} data='{"j": 1}' values={'a': '1'}
  POST multipart     → 200 args={} form={'f': '1'} files=['file'] json='UnsupportedMediaType' data='' values={'f': '1'}
  POST text/plain    → 200 args={} form={} files=[] json='UnsupportedMediaType' data='raw text' values={}
  PUT 表单             → 200 args={} form={'f': '1'} files=[] json='UnsupportedMediaType' data='' values={'f': '1'}
  PATCH JSON         → 200 args={} form={} files=[] json={'j': 2} data='{"j": 2}' values={}
  DELETE ?a=1        → 200 args={'a': '1'} form={} files=[] json='UnsupportedMediaType' data='' values={'a': '1'}

上一篇:Form Data 与 JSON Body;下一篇:文件上传与 FileStorage。

request.json 与 get_json

实测 · 本机执行输出
  JSON         {'get_json()': {'a': 1}, 'get_json(silent=True)': {'a': 1}, 'request.json': {'a': 1}}
  表单           {'get_json()': 'UnsupportedMediaType(415)', 'get_json(silent=True)': None, 'request.json': 'UnsupportedMediaType(415)'}
  空正文无类型       {'get_json()': 'UnsupportedMediaType(415)', 'get_json(silent=True)': None, 'request.json': 'UnsupportedMediaType(415)'}

request.data

实测 · 本机执行输出
  从第一节:POST 表单 data =  | POST JSON data = {"j": 1} | text/plain data = raw text (get_data_len = 8 )

同名时的优先级

实测 · 本机执行输出
  args["k"] = args | form["k"] = form | values["k"] = args (args 在前)

类型差别

实测 · 本机执行输出
  args["id"] = '5' | json["id"] = 5

分步演示

args / form / json
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动
    • 没有验证:chunked 与 gzip 压缩的请求体、真实浏览器的 GET 带正文行为、request.values 在 Flask 其它版本里的合并顺序、Content-Type 带 boundary 错误的 multipart
    京ICP备2026067502号-1京公网安备11010502063487号