Python+Flask操作MySQL遇Method Not Allowed错误求助
解决Flask中删除功能的"Method Not Allowed"错误
你遇到的这个错误核心原因很明确:你的Flask路由默认只接受GET请求,但删除操作的触发方式(比如表单提交、AJAX请求)大概率用的是POST方法,两者不匹配就会抛出这个报错。
问题拆解
先看你的路由定义:
@app.route('/delete_klas/<string:id>')
Flask的@app.route装饰器默认只允许GET请求。如果前端是通过表单(form标签)以POST方式提交删除请求,就会直接触发"Method Not Allowed"。另外,你的代码里还有个小疏漏:cur.close应该写成cur.close()(少了括号,游标无法被正确关闭)。
解决方案
方法1:修改路由支持POST方法(推荐)
按照HTTP规范,修改/删除数据应该用POST或DELETE方法,我们给路由加上methods参数来支持POST:
#delete klas @app.route('/delete_klas/<string:id>', methods=['POST']) @is_logged_in def delete_klas(id): if 'count' in session.keys(): session['count'] += 1 else: session['count'] = 1 #create cursor cur = mysql.connection.cursor() #execute cur.execute("DELETE FROM klassen WHERE id = %s", [id]) #commit mysql.connection.commit() #close(这里补上括号) cur.close() flash('klas verwijdert', 'success') return redirect(url_for('intranet'))
同时前端要对应使用POST方式触发:
- 如果是表单提交,确保表单的
method="POST":<form action="/delete_klas/{{ klas.id }}" method="POST"> <button type="submit">删除班级</button> </form> - 如果是AJAX请求,设置请求方法为
POST即可。
方法2:允许GET方法(不推荐)
如果你一定要用GET请求触发删除(非常不建议,因为GET请求会被浏览器缓存,用户误刷新页面可能重复执行删除操作,存在安全风险),可以显式声明允许GET:
@app.route('/delete_klas/<string:id>', methods=['GET'])
然后用链接触发:
<a href="/delete_klas/{{ klas.id }}">删除班级</a>
再次提醒,这种方式不符合HTTP设计规范,尽量避免使用。
内容的提问来源于stack exchange,提问作者Mats Vingerhoets
相关产品推荐
相关产品推荐

