如何修复Flask中Error 405 Method Not Allowed错误?
问题分析与修复方案
核心问题1:表单提交路径不匹配
你的模板中表单的action属性是/sort-review(连字符),但Flask路由定义的是/sort_review(下划线),路径不一致会导致POST请求被路由到错误端点,进而引发后续静态资源请求的异常。
修复:将模板中的表单action改为与路由一致:
<form action="/sort_review" method="post">
核心问题2:Query对象属性访问错误
在confirm分支中,r = UnsortedReview.query.filter_by(id=CURRENT_ID)返回的是Query对象而非数据库实例,直接访问r.review会抛出AttributeError。
修复:添加.first()获取实例并增加空值判断:
elif "confirm" in request.form: r = UnsortedReview.query.filter_by(id=CURRENT_ID).first() if r: review = r.review db.session.delete(r) db.session.commit() # 补充name字段(SortedReview模型必填) d = SortedReview(name=r.name, review=review) db.session.add(d) db.session.commit()
核心问题3:SortedReview缺少必填字段
SortedReview模型定义了name字段且nullable=False,但创建实例时只传入了review,会触发数据库完整性错误,需要从UnsortedReview中同步name字段。
核心问题4:全局CURRENT_ID的线程安全隐患
使用全局变量CURRENT_ID存储当前评论ID,多管理员同时操作时会互相干扰,导致错误的评论被删除或转移。
修复:通过表单隐藏字段传递当前评论ID:
- 在模板表单中添加隐藏字段:
<form action="/sort_review" method="post"> <input type="hidden" name="review_id" value="{{ tmp.id }}"> <!-- 原有表单内容不变 --> </form>
- 在路由中通过
request.form获取ID,删除全局变量:
# 删除global CURRENT_ID声明 if request.method == "POST": review_id = request.form.get('review_id') if not review_id: pass if "reject" in request.form: UnsortedReview.query.filter_by(id=review_id).delete() db.session.commit() elif "confirm" in request.form: r = UnsortedReview.query.filter_by(id=review_id).first() if r: review = r.review db.session.delete(r) db.session.commit() d = SortedReview(name=r.name, review=review) db.session.add(d) db.session.commit() # 后续获取tmp后,无需设置CURRENT_ID,直接传递给模板即可
静态资源405错误的根源
静态资源的405 Method Not Allowed错误是因为表单提交到错误路径后,服务器返回的页面路径解析异常,或错误路由匹配到了静态资源路径。修复表单提交路径后,该问题会随之解决。
内容的提问来源于stack exchange,提问作者Alex Valerian
相关产品推荐
相关产品推荐

