我正在阅读flask mega 教程第 5 章,发现其中有一部分我不明白:form
变量似乎在对路由函数的调用之间保持在范围内,请参见下面的代码(第 5 章中的完整示例中的缩写)。
@app.route("/register", methods=["GET", "POST"])
def register():
form = RegistrationForm()
if form.validate_on_submit():
#Add user to data base
return redirect(url_for("login"))
return render_template("register.html", title="Register", form=form)
我的理解如下:
首次导航到时,/register
它会被调用"GET"
。 会form
被实例化,并且form.validate_on_submit()
会false
返回表单,然后用户会填写表单。
当用户提交表单时,/register
路由被调用。在我看来,上次调用"POST"
的函数范围应该丢失,一个新的实例应该再次被实例化,我们会陷入循环。register()
form
form.validate_on_submit
false
调试表明它不是这样工作的,我最好的理解是它form
以某种方式持续存在,但我不明白为什么/它通过什么机制持续存在。有人能告诉我吗?
第一个请求是 GET,因此
form.validate_on_submit()
返回false
,因为form.is_submitted()
或request.method
检查它是否是 POST 请求。form.validate()
检查输入的因此根本不应该调用。在第二次使用 POST 调用时,在表单实例化期间会自动采用来自
request.form
和 的输入表单数据。因此,只要输入有效,就会被采用。 只要用户没有被重定向或表单数据设置为 none,它就会被保留。出于安全原因,它只会影响和 而不会影响。request.files
form.validate_on_submit()
true
request.form
request.files