接收表单数据
点击提交按钮,浏览器将显示“Method Not Allowed”错误。为什么呢? 这是因为之前的登录视图功能到目前为止只完成了一半的工作。 它可以在网页上显示表单,但没有逻辑来处理用户提交的数据。Flask-WTF 可以轻松完成这部分工作, 以下是视图函数的更新版本,它接受和验证用户提交的数据:
from flask import render_template, flash, redirect
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for user {}, remember_me={}'.format(
form.username.data, form.remember_me.data))
return redirect('/index')
return render_template('login.html', title='Sign In', form=form)
这个版本中的第一个新东西是路由装饰器中的 methods
参数。 它告诉 Flask 这个视图函数接受 GET
和 POST
请求,并覆盖了默认的 GET
。 HTTP 协议规定对 GET
请求需要返回信息给客户端(本例中是浏览器)。 本应用的所有 GET
请求都是如此。 当浏览器向服务器提交表单数据时,通常会使用 POST
请求(实际上用 GET
请求也可以,但这不是推荐的做法)。之前的“Method Not Allowed”错误正是由于视图函数还未配置允许 POST
请求。 通过传入 methods
参数,你就能告诉 Flask 哪些请求方法可以被接受。
form.validate_on_submit()
实例方法会执行 form 校验的工作。当浏览器发起 GET
请求的时候,它返回 False
,这样视图函数就会跳过 if
块中的代码,直接转到视图函数的最后一句来渲染模板。
当用户在浏览器点击提交按钮后,浏览器会发送 POST
请求。 form.validate_on_submit()
就会获取到所有的数据,运行字段各自的验证器,全部通过之后就会返回 True
,这表示数据有效。不过,一旦有任意一个字段未通过验证,这个实例方法就会返回 False
,引发类似 GET
请求那样的表单的渲染并返回给用户。稍后我会在添加代码以实现在验证失败的时候显示一条错误消息。
当 form.validate_on_submit()
返回 True
时,登录视图函数调用从 Flask 导入的两个新函数。 flash()
函数是向用户显示消息的有效途径。 许多应用使用这个技术来让用户知道某个动作是否成功。我将使用这种机制作为临时解决方案,因为我没有基础架构来真正地登录用户。 显示一条消息来确认应用已经收到登录认证凭据,我认为对当前来说已经足够了。
登录视图函数中使用的第二个新函数是 redirect()
。这个函数指引浏览器自动重定向到它的参数所关联的 URL。当前视图函数使用它将用户重定向到应用的主页。
当你调用 flash()
函数后,Flask 会存储这个消息,但是却不会奇迹般地直接出现在页面上。模板需要将消息渲染到基础模板中,才能让所有派生出来的模板都能显示出来。更新后的基础模板代码如下:
<html>
<head>
{% if title %}
<title>{{ title }} - microblog</title>
{% else %}
<title>microblog</title>
{% endif %}
</head>
<body>
<div>
Microblog:
<a href="/index">Home</a>
<a href="/login">Login</a>
</div>
<hr>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>
此处我用了 with
结构在当前模板的上下文中来将 get_flashed_messages()
的结果赋值给变量 messages
。 get_flashed_messages()
是 Flask 中的一个函数,它返回用 flash()
注册过的消息列表。接下来的条件结构用来检查变量 messages
是否包含元素,如果有,则在 <ul>
元素中,为每条消息用 <li>
元素来包裹渲染。这种渲染的样式结果看起来不会美观,之后会有主题讲到 Web 应用的样式。
闪现消息的一个有趣的属性是,一旦通过 get_flashed_messages
函数请求了一次,它们就会从消息列表中移除,所以在调用 flash()
函数后它们只会出现一次。
时机成熟,再次测试表单吧,将 username 和 password 字段留空并点击提交按钮来观察 DataRequired
验证器是如何中断提交处理流程的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论