使用Flask Login登录失败:405 Method Not Allowed错误求助
Flask Login 405 Method Not Allowed 错误修复方案
核心问题分析
- 登录表单直接向
/secrets发送POST请求,但secrets路由未处理该场景的表单提交逻辑,同时违背了登录流程的正确逻辑(应先提交到/login路由完成身份验证)。 - 登录成功后重定向到
secrets时,通过URL传递的name参数,在secrets路由中用request.form.get()获取,但GET请求无法从表单数据中读取内容。
具体修复步骤
1. 修正登录表单的提交目标
修改login.html中的表单提交地址,指向负责登录验证的login路由:
{% extends "base.html" %} {% block content %} <div class="box"> <h1>Login</h1> <form action="{{ url_for('login') }}" method="POST"> <input type="text" name="email" placeholder="Email" required="required"/> <input type="password" name="password" placeholder="Password" required="required"/> <button type="submit" class="btn btn-primary btn-block btn-large">Let me in.</button> </form> </div> {% endblock %}
2. 修正secrets路由获取用户名的方式
登录成功后用户已通过Flask-Login认证,直接从current_user对象中获取用户邮箱即可,无需手动传递参数:
from flask_login import current_user @app.route('/secrets', methods=['GET']) @login_required def secrets(): # 从已登录用户对象中直接获取邮箱 name = current_user.email return render_template("secrets.html", name=name)
注:这里将
methods改为仅支持GET,因为secrets页面无需处理POST请求,进一步避免方法不匹配问题。
3. 恢复密码验证逻辑(必要优化)
取消密码验证代码的注释,确保登录流程的安全性:
@app.route('/login',methods=['GET','POST']) def login(): if request.method == 'POST': email = request.form.get('email') print(email) user = db.session.query(User).filter_by(email=email).first() if user: # 恢复密码哈希验证逻辑 if check_password_hash(user.password, request.form.get('password')): login_user(user) return redirect(url_for('secrets')) return render_template("login.html")
修复逻辑说明
- 表单提交到
/login路由完成身份验证,验证通过后重定向到secrets页面(GET请求),符合HTTP重定向的最佳实践,同时避免表单重复提交问题。 - 使用
current_user获取已登录用户信息是Flask-Login的标准用法,无需手动传递参数,更安全可靠。 - 限制
secrets路由仅支持GET方法,明确页面职责,避免不必要的方法冲突。
内容的提问来源于stack exchange,提问作者ozerutku13
相关产品推荐
相关产品推荐

