Bootstrap

Flask开发基础步骤之三:表单form及相关知识

1、Request响应对象:为了能够处理POST请求,需要修改视图函数:
@app.route(’/’, methods=[‘GET’, ‘POST’])

Flask会在请求触发后把请求信息放到request对象里,你可以从flask包导入:

from flask import request

因为它在请求触发时才会包含数据,所以只能在视图函数内部调用它。它包含请求相关的所有信 息,比如请求的路径( request.path )、请求的方法( request.method )、表单数据 ( request.form )、查询字符串( request.args )等等。

if request.method == 'POST': 
    title = request.form.get('title')
    year = request.form.get('year')

2、session会话:Flask提供的session对象用来在请求间存储数据,它会把数据签名后存储到浏览器的Cookie中,Flask使用密钥保护用户会话,每个应用的密钥应该不同。

app.config['SECRET_KEY'] = 'hard to guess string'

为了增强安全性,密钥不应该直接写入源码,而要保存在环境变量中。

2、flash消息:在页网页上显示一个提示消息。
在视图函数里定义一个包含消息内容的变量,传入模板,然后在模板里渲染显示它。
flash()函数用来在视图函数里向模板传递提示消 息, get_flashed_messages()函数则用来在模板中获取提示消息。
flash消息需要配置session的SECRET_KEY

# 视图函数中传递消息
from flask import flash
...

flash('Item Created.')
<!--在模板里使用  get_flashed_messages()  函数获取提示消息并显示 --!>
{% for message in get_flashed_messages() %}
    <div class="alert">{{ message }}</div>
{% endfor %} <h2>...</h2>

3、重定向响应:特殊的响应,它会返回一个新的 URL,浏览器在接受到这样的响应后会向这个新 URL 再次发起一个新的请求。Flask 提供了 redirect() 函数来快捷生成这种响应,传入重定 向的目标 URL 作为参数。

from flask import redirect
...
return redirect(url_for('index')) 

4、url_for()
使用url_for()函数动态生成URL,取代硬编码的URL。

"""
使用 url_for() 生成动态 URL 时,将动态部分作为关键字参数传入
"""
url_for('user', name='john', _external=True) """
返回结果是 http://localhost:5000/user/john """
"""
传给 url_for() 的关键字参数不仅限于动态路由中的参数,非动态的参数也会添加到查询字符串中
"""
url_for('user', name='john', page=2, version=1) 
"""
返回结果是 /user/ john?page=2&version=1。
"""

5、Flask-WTF对独立的 WTForms 包进行了包装,方便集成到 Flask 应用中。

pip install flask-wtf

WTF需要配置session的SECRET_KEY

每个 Web 表单都由一个继承自 FlaskForm 的类表示。

from flask_wtf import FlaskForm 
from wtforms import StringField, SubmitField 
from wtforms.validators import DataRequired 
 
class NameForm(FlaskForm):     
    name = StringField('What is your name?', validators=[DataRequired()])
    submit = SubmitField('Submit')

6、 Bootstrap 的表单样式
Flask-Bootstrap扩展提供了一个高层级的辅助函数,可以使用 Bootstrap 预定义的表单样式渲染整个 Flask-WTF 表单。

<!-- 使用 Flask-WTF 和 Flask-Bootstrap 渲染表单 --!>
{% extends "base.html" %} 
{% import "bootstrap/wtf.html" as wtf %} 

{% block title %}Flasky{% endblock %} 
{% block page_content %} 
<div class="page-header">
    <h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>
</div> 
{{ wtf.quick_form(form) }} 
{% endblock %}

7、**在视图函数中处理表单**
```python
"""
hello.py:使用 GET 和 POST 请求方法处理 Web 表单 
"""
@app.route('/', methods=['GET', 'POST'])
def index():
    name = None
    form = NameForm()
    if form.validate_on_submit():         
        name = form.name.data
        form.name.data = ''
    return render_template('index.html', form=form, name=name) 
;