Flask登录出现Bad Request错误,请求协助排查与修复
Flask登录报Bad Request错误的解决方法
你遇到的"Bad Request"错误根源很明确:表单里的输入框没有设置name属性。Flask的request.form依赖输入框的name属性来获取提交的值,没有这个属性的话,提交后request.form里不会包含username和password这两个键,直接用request.form['username']访问就会触发服务器无法理解的请求错误。
修复步骤:
1. 修改HTML模板login.html
给用户名和密码输入框添加对应的name属性,同时修正HTML结构并明确表单提交地址:
{% extends 'mastertemplate.html' %} {% block title %}Login Page{% endblock %} {% block content %} <style> h1 { text-align: center; } </style> <body> <h1>Please Login</h1> <form method="post" action="/login"> <table border="1" align="center"> <tr><td>Login</td><td><input type="text" name="username" class="btLoginButton"></td></tr> <tr><td>Password</td><td><input type="password" name="password"></td></tr> <tr><td></td><td><input type="submit" value="login" class="btLoginButton"></td></tr> </table> </form> </body> {% endblock %}
注:子模板里不需要重复写
<head>标签,应该把这类基础结构放在母版mastertemplate.html中,避免HTML结构混乱。
2. 修改路由里的内嵌表单
同样给输入框添加name属性,并修正HTML结构:
@app.route("/loginuser") def loginpage(): return render_template("login.html") @app.route("/login", methods=['GET','POST']) def login(): if request.method == 'POST': # 用get方法避免键不存在直接报错,返回None可提前做参数校验 username = request.form.get('username') password = request.form.get('password') if not username or not password: return "请输入用户名和密码" success, message, name = checklogin(username, password) if success: session['username'] = name return redirect('/balance') else: return message return """ <html> <head> <title>Login</title> <style> h1 { text-align: center; } </style> </head> <body> <form method="post" action="/login"> <h1>Please Login</h1> <table border="1" align="center"> <tr><td>Login</td><td><input type="text" name="username" class="btLoginButton"></td></tr> <tr><td>Password</td><td><input type="password" name="password"></td></tr> <tr><td></td><td><input type="submit" value="login" class="btLoginButton"></td></tr> </table> </form> </body> </html> """
额外提示:使用
request.form.get('key')替代直接方括号访问,能避免因用户未输入内容导致的直接报错,可提前对参数做合法性校验。
内容的提问来源于stack exchange,提问作者abxty
相关产品推荐
相关产品推荐

