如何在使用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
相关产品推荐
相关产品推荐

