You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在使用flask.app.test_client测试Flask应用时指定请求头?

在Flask test_client中添加JWT请求头的几种方法

当然有办法啦!我来给你分享几个实用的方案,帮你在测试带JWT认证的Flask API时轻松带上认证头:

方法1:在单个请求中直接指定headers

最简单的方式就是在调用test_client的请求方法(比如get、post)时,通过headers参数传入JWT认证头。JWT的标准格式是Authorization: Bearer <你的令牌字符串>,代码示例如下:

from app import app
import unittest

class AppTests(unittest.TestCase):
    def setUp(self):
        self.app = app.app.test_client()
        # 这里可以提前获取JWT令牌,比如调用登录接口
        login_res = self.app.post('/login', json={"username": "test", "password": "test123"})
        self.jwt_token = login_res.json.get("access_token")

    def test_info_page(self):
        # 发送带JWT头的请求
        response = self.app.get(
            '/info',
            headers={'Authorization': f'Bearer {self.jwt_token}'}
        )
        # 断言响应是否符合预期
        self.assertEqual(response.status_code, 200)

方法2:封装统一的认证请求方法(避免重复代码)

如果多个测试用例都需要带JWT头,你可以在setUp里封装一个通用的请求方法,这样每个测试用例直接调用即可,不用重复写headers:

from app import app
import unittest

class AppTests(unittest.TestCase):
    def setUp(self):
        self.app = app.app.test_client()
        # 获取JWT令牌
        login_res = self.app.post('/login', json={"username": "test", "password": "test123"})
        self.jwt_token = login_res.json.get("access_token")

        # 封装带认证头的请求方法
        def auth_request(method, path, **kwargs):
            # 合并传入的headers和认证头
            req_headers = kwargs.pop('headers', {})
            req_headers['Authorization'] = f'Bearer {self.jwt_token}'
            return self.app.open(path, method=method, headers=req_headers, **kwargs)
        
        self.auth_request = auth_request

    def test_info_page(self):
        # 直接调用封装好的方法
        response = self.auth_request('GET', '/info')
        self.assertEqual(response.status_code, 200)

    def test_another_protected_endpoint(self):
        # 支持传入其他参数,比如json数据
        response = self.auth_request('POST', '/create', json={"data": "test"})
        self.assertEqual(response.status_code, 201)

方法3:用Flask-JWT-Extended直接生成测试令牌(如果用了该扩展)

如果你使用的是Flask-JWT-Extended这个常用的JWT扩展,可以直接在测试中生成合法的测试令牌,无需调用登录接口,非常方便:

from app import app
import unittest
from flask_jwt_extended import create_access_token

class AppTests(unittest.TestCase):
    def setUp(self):
        self.app = app.app.test_client()
        # 直接生成测试用的JWT令牌,指定用户身份
        self.jwt_token = create_access_token(identity="test_user_id")

    def test_info_page(self):
        response = self.app.get(
            '/info',
            headers={'Authorization': f'Bearer {self.jwt_token}'}
        )
        self.assertEqual(response.status_code, 200)

需要注意的是,不管用哪种方法,都要确保JWT令牌的格式正确——Bearer和令牌之间有一个空格,这是很多人容易踩的小坑哦!

内容的提问来源于stack exchange,提问作者rgaduputi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:49:28