Flask-Classful最小示例访问根路径报404错误问题咨询
问题产生原因
出现404的核心原因是混用了Flask原生路由装饰器和Flask-Classful类视图的注册逻辑,具体有两个问题:
- 你在类视图的
index方法上使用了@app.route("/"),这个装饰器只对独立的全局视图函数生效,修饰类内部方法时,拿到的是未绑定的类方法,根本不会把根路径注册到这个方法上。 - Flask-Classful注册类视图时,默认会根据类名自动生成路由前缀:
QuotesView对应的默认前缀是/quotes,类中index方法默认匹配的路径是/quotes/,本身就不会绑定根路径/,访问根路径自然报404。
改端口没用是因为端口和路由匹配逻辑完全无关,只是改了服务监听的位置,路由规则没改的话问题会一直存在。
修复方案
两种正确写法可选:
方案1:指定类视图的路由前缀
直接给视图类设置route_base属性指定根路径,去掉多余的@app.route装饰器即可:
from flask import Flask from flask_classful import FlaskView # 存放名言列表 quotes = [ "A noble spirit embiggens the smallest man! ~ Jebediah Springfield", "If there is a way to do it better... find it. ~ Thomas Edison", "No one knows what he can do till he tries. ~ Publilius Syrus" ] app = Flask(__name__) class QuotesView(FlaskView): route_base = "/" # 将当前类视图的路由前缀设为根路径 def index(self): return "<br>".join(quotes) QuotesView.register(app) if __name__ == '__main__': app.run()
方案2:使用Flask-Classful自带的路由装饰器
如果需要给类方法单独绑定路由,不要用@app.route,要导入Flask-Classful提供的route装饰器:
from flask import Flask from flask_classful import FlaskView, route quotes = [ "A noble spirit embiggens the smallest man! ~ Jebediah Springfield", "If there is a way to do it better... find it. ~ Thomas Edison", "No one knows what he can do till he tries. ~ Publilius Syrus" ] app = Flask(__name__) class QuotesView(FlaskView): route_base = "/" @route("/") # 用框架自带的装饰器绑定根路由 def index(self): return "<br>".join(quotes) QuotesView.register(app) if __name__ == '__main__': app.run()
验证方式:修改完成后重启服务,直接访问
http://127.0.0.1:5000就能正常返回名言列表。如果不设置route_base,访问http://127.0.0.1:5000/quotes/也能看到默认规则下的返回结果。
内容的提问来源于stack exchange,提问作者Harsha Biyani
相关产品推荐
相关产品推荐

