返回介绍

接收表单数据

发布于 2025-01-02 21:53:48 字数 3311 浏览 0 评论 0 收藏 0

点击提交按钮,浏览器将显示“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 这个视图函数接受 GETPOST 请求,并覆盖了默认的 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() 的结果赋值给变量 messagesget_flashed_messages() 是 Flask 中的一个函数,它返回用 flash() 注册过的消息列表。接下来的条件结构用来检查变量 messages 是否包含元素,如果有,则在 <ul> 元素中,为每条消息用 <li> 元素来包裹渲染。这种渲染的样式结果看起来不会美观,之后会有主题讲到 Web 应用的样式。

闪现消息的一个有趣的属性是,一旦通过 get_flashed_messages 函数请求了一次,它们就会从消息列表中移除,所以在调用 flash() 函数后它们只会出现一次。

时机成熟,再次测试表单吧,将 username 和 password 字段留空并点击提交按钮来观察 DataRequired 验证器是如何中断提交处理流程的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文