如何解决Flask中TypeError: home()缺失必需位置参数'usr'的错误
解决Flask中
TypeError: home() missing 1 required positional argument: 'usr'的问题 这个错误的根源是Flask没办法给你的home()函数传递它必需的usr参数,主要有两个地方需要修正:
1. 路由定义缺少URL参数占位符
你的/home路由没有在URL路径里定义参数位置,Flask不知道从哪里获取usr的值传递给函数。你需要在路由中添加<usr>作为参数占位符,这样Flask会自动把URL中对应位置的内容作为usr参数传给home()函数。
2. Redirect时参数值写错了
在login函数的POST处理分支里,你写的是redirect(url_for("home", usr="user"))——这里的"user"是固定字符串,不是你从表单里获取到的用户输入变量user。就算路由修好了,传过去的也只是文本"user",而不是实际的用户名。
另外,你的原代码缩进有问题(Python对缩进很严格),我也一起修正了。下面是完整的修复后代码:
@app.route("/", methods=["POST", "GET"]) def login(): if request.method == "POST": user = request.form["name"] # 把"user"改成变量user,传递实际用户名 return redirect(url_for("home", usr=user)) else: return render_template("login.html") # 在路由中添加<usr>占位符,接收URL参数 @app.route("/home/<usr>", methods=["POST", "GET"]) def home(usr): # return render_template("home.html") return f"<h1>{usr}</h1>" @app.route("/report") def report(): return render_template("report.html") @app.route("/register") def register(): return render_template("register.html") if __name__ == "__main__": app.run(debug=True)
最后别忘了确保你的login.html表单里有一个name属性为name的输入框,这样才能正确获取用户输入:
<form method="POST"> <input type="text" name="name" placeholder="输入用户名"> <button type="submit">登录</button> </form>
这样修改后,用户提交表单后会跳转到/home/[用户名]的路径,home()函数也能正确接收到usr参数,不会再出现那个TypeError了。
内容的提问来源于stack exchange,提问作者Cedric Dsouza
相关产品推荐
相关产品推荐

