<form>
标签里使用 method
属性将提交表单数据的 HTTP 请求方法指定为 POST。如果不指定,则会默认使用 GET 方法,这会将表单数据通过 URL 提交,容易导致数据泄露,而且不适用于包含大量数据的情况。<input>
元素必须要指定 name
属性,否则无法提交数据,在服务器端,我们也需要通过这个 name
属性值来获取对应字段的数据。提示 填写输入框标签文字的<label>
元素不是必须的,只是为了辅助鼠标用户。当使用鼠标点击标签文字时,会自动激活对应的输入框,这对复选框来说比较有用。for
属性填入要绑定的<input>
元素的id
属性值。
autocomplete
属性设为 off
来关闭自动完成(按下输入框不显示历史输入记录);另外还添加了 required
标志属性,如果用户没有输入内容就按下了提交按钮,浏览器会显示错误提示。<form>
元素使用 action
属性可以自定义目标 URL)。index
视图默认只接受 GET 请求。提示 在 HTTP 中,GET 和 POST 是两种最常见的请求方法,其中 GET 请求用来获取资源,而 POST 则用来创建 / 更新资源。我们访问一个链接时会发送 GET 请求,而提交表单通常会发送 POST 请求。
app.route()
装饰器里,我们可以用 methods
关键字传递一个包含 HTTP 方法字符串的列表,表示这个视图函数处理哪种方法类型的请求。默认只接受 GET 请求,上面的写法表示同时接受 GET 和 POST 请求。if
语句内,我们编写了处理表单数据的代码,其中涉及 3 个新的知识点,下面来一一了解。request
对象里,你可以从 flask
包导入它:request.path
)、请求的方法(request.method
)、表单数据(request.form
)、查询字符串(request.args
)等等。if
语句中,我们首先通过 request.method
的值来判断请求方法。在 if
语句内,我们通过 request.form
来获取表单数据。request.form
是一个特殊的字典,用表单字段的 name
属性值可以获取用户填入的对应数据:flash()
函数用来在视图函数里向模板传递提示消息,get_flashed_messages()
函数则用来在模板中获取提示消息。flash()
的用法很简单,首先从 flask
包导入 flash
函数:flash()
函数在内部会把消息存储到 Flask 提供的 session
对象里。session
用来在请求间存储数据,它会把数据签名后存储到浏览器的 Cookie 中,所以我们需要设置签名所需的密钥:提示 这个密钥的值在开发时可以随便设置。基于安全的考虑,在部署时应该设置为随机字符,且不应该明文写在代码里, 在部署章节会详细介绍。
get_flashed_messages()
函数获取提示消息并显示:alert
类为提示消息增加样式:<input>
元素内添加 required
属性实现的验证(客户端验证)并不完全可靠,我们还要在服务器端追加验证:redirect()
函数来快捷生成这种响应,传入重定向的目标 URL 作为参数,比如 redirect('http://helloflask.com')
。url_for()
函数生成:<int:movie_id>
部分表示 URL 变量,而 int
则是将变量转换成整型的 URL 变量转换器。在生成这个视图的 URL 时,我们也需要传入对应的变量,比如 url_for('edit', movie_id=2)
会生成 /movie/edit/2。movie_id
变量是电影条目记录在数据库中的主键值,这个值用来在视图函数里查询到对应的电影记录。查询的时候,我们使用了 get_or_404()
方法,它会返回对应主键的记录,如果没有找到,则返回 404 错误响应。<input>
元素的 value
属性即可将它们提前写到输入框里。完整的编辑页面模板如下所示:<a>
标签(CSRF 令牌存储在元素属性里),而不用创建表单元素。