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)