bigywater.tech
Flask · 151

Flask Test Client

Flask 的测试客户端到底能做什么?cookie 怎么处理?重定向要不要跟随?怎么预置登录状态?流式响应能不能测?这篇逐项运行并打印结果。

7 项
本篇逐项验证的 test_client 用法
ValueError
URL 里写了查询串又传 query_string 时抛出的异常
with client:
让请求之后仍能读取 request 与 g 的写法

请求的写法

实测 · 本机执行输出
  json= → {'ctype': 'application/json', 'got': {'a': 1}} (Content-Type 由客户端自动设成 application/json)
  query_string={a:[1,2], b:x} → {'a': ['1', '2'], 'b': ['x']}
  URL 里已有查询串,同时传 query_string → ValueError: Query string is defined in the path and as an argument

上一篇:WebSocket 与 Flask-SocketIO;下一篇:test_request_context()。

cookie 罐

实测 · 本机执行输出
  同一个客户端的下一个请求读到的 cookie: 1
  use_cookies=False 的客户端: none
  两个客户端互不影响: none

重定向

实测 · 本机执行输出
  默认 → 302 Location: /home
  follow_redirects=True → 200 {'host': 'localhost', 'ip': '127.0.0.1', 'scheme': 'http', 'user': 'ann'} | r.history 长度: 1

预置 session

实测 · 本机执行输出
  预置 session 后访问 /home → preset

环境覆盖

实测 · 本机执行输出
  environ_overrides REMOTE_ADDR → 203.0.113.7
  base_url='https://example.test' → https example.test
  默认的主机名与地址: localhost 127.0.0.1

请求之后的上下文

实测 · 本机执行输出
  普通调用之后读 g.x → RuntimeError: Working outside of application context.
  with client: 里请求之后读 request.args.get("z") → 9 | g.x → in-request

流式响应

实测 · 本机执行输出
  普通 get: '0\n1\n2\n'
  buffered=False: [b'0\n', b'1\n', b'2\n'] (迭代器,可以逐块消费)

分步演示

Flask Test Client
本步的对象

    本文用到的工具与边界

    • 本机 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,数字每次运行会有小幅抖动
    • 没有验证:test_client 的 follow_redirects 在重定向循环时的行为、multipart 表单与文件(第 157 篇)、异步视图下的测试(需要 asgiref,见第 137 篇)、client.open 与 EnvironBuilder 的低层用法
    京ICP备2026067502号-1京公网安备11010502063487号