测试Python Flask读取表单数据的POST方法时报字段不存在错误如何解决
Flask登录接口测试报错修复方案
你的问题有两个核心诱因,分别对应测试代码的语法错误和接口代码的逻辑漏洞,按下面的步骤改就能解决:
1. 修复测试代码的缩进错误
你当前的测试代码里,response = c.post(...) 这行的缩进不对,跑到了with flask_app.test_client() as c:的上下文块外面。等test_client的上下文退出之后再发请求,之前配置的参数、会话上下文全失效了,表单数据根本没被带到请求里,才会触发字段不存在的报错。
另外几个冗余的点可以一起调整:
- 不需要提前在
session_transaction里手动塞username,登录接口本身就是要校验表单传的账号信息,提前往session写值不符合实际登录场景 - Flask测试客户端发POST请求传字典类型的data时,默认Content-Type就是
application/x-www-form-urlencoded,不需要手动加请求头
修正后的测试代码:
class TestLogin(unittest.TestCase): def test_login(self): flask_app = create_app() flask_app.config['WTF_CSRF_ENABLED'] = False data = {"username": "admin"} with flask_app.test_client() as c: # post请求必须在test_client的上下文块内 response = c.post('/login', data=data, follow_redirects=True) # 后续可以补充你的断言逻辑,比如校验响应状态、页面内容 self.assertEqual(response.status_code, 200)
2. 修复接口代码的参数取值逻辑
你现在接口里直接写request.form['username']的写法有问题:只要请求里没带username字段,这行代码会直接抛出KeyError,根本走不到后面的is not None判断。
两种改法选一个就行:
- 临时兼容改法:用
.get()方法取表单字段,字段不存在时默认返回None,匹配你现有的判断逻辑
@ICEAPP.route('/login', methods=['GET', 'POST']) def login(): session['ContactList'] = [] form = LoginForm() if request.method == 'POST': username = request.form.get('username') if username is not None: # 原有后续登录逻辑 pass
- 标准Flask-WTF改法:你已经实例化了LoginForm,直接用WTForms自带的校验逻辑即可,不用手动从request.form取数,还能自动做参数合法性校验
@ICEAPP.route('/login', methods=['GET', 'POST']) def login(): session['ContactList'] = [] form = LoginForm() # validate_on_submit会自动判断是不是POST请求,同时跑表单校验规则 if form.validate_on_submit(): username = form.username.data # 后续登录逻辑 pass
内容的提问来源于stack exchange,提问作者user686027
相关产品推荐
相关产品推荐

