Flask混用app.route与api.add_resource报KeyError: 'view_class'如何解决
错误产生原因
这个错误的核心是Flask视图endpoint命名冲突:
- 你用
@app.route('/test')定义普通函数视图时,Flask默认会把函数名test作为该视图的endpoint值。 - Flask-RESTful调用
api.add_resource()注册资源类时,默认会把资源类名小写作为endpoint值,你的资源类名为Test,自动生成的endpoint就是test。 - 两个视图的endpoint重复,Flask-RESTful注册资源时会尝试读取已有endpoint对应视图的
view_class属性,但普通函数视图没有这个属性,直接抛出KeyError。
修复方案
任选以下任意一种方案即可解决冲突:
方案1:修改普通视图的endpoint标识
要么修改视图函数名称,避免和资源类名小写重复:
# 将原test函数改名 @app.route('/test') def test_page(): return "Hello World"
要么显式指定普通视图的endpoint值:
@app.route('/test', endpoint='test_page') def test(): return "Hello World"
方案2:注册资源时显式指定endpoint
给Flask-RESTful资源自定义endpoint,避免和普通视图冲突:
api.add_resource(Test, "/api/test/<string:test_id>", endpoint='api_test')
方案3:修改资源类名
将资源类名改为不会和普通视图函数名冲突的名称,比如加上Resource后缀:
# resources/test.py中修改类名 class TestResource(Resource): # 原有逻辑不变 # app.py中注册对应修改后的类 from resources.test import TestResource api.add_resource(TestResource, "/api/test/<string:test_id>")
内容的提问来源于stack exchange,提问作者Amin Ba
相关产品推荐
相关产品推荐

