1、flask的4中请求钩子:
为了避免在每个视图函数中都使用重复的代码,Flask提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后调用,请求钩子使用修饰器实现。在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g。
1)before_first_request:顾名思义,注册一个在处理第一个请求之前运行的函数。
from flask import Flask,g
app=Flask(__name__)
@app.route('/test')
def test():
return g.string
@app.before_first_request
def bf_first_request():
g.string='before_first_request'
if __name__=='__main__':
app.run()
执行结果如下:
如果不写@app.before_first_request这段代码会报错。
2) before_request:注册一个在处理每次请求之前运行的函数。
from flask import Flask,g
app=Flask(__name__)
@app.route('/test')
def test():
return g.string
@app.before_request
def bf_request():
g.string = 'before_request'
if __name__=='__main__':
app.run()
执行结果:
3) after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行。注册的函数至少需要含有一个参数,这个参数实际上为服务器的响应,且函数中需要返回这个响应参数.
@app.after_request
def af_request(param):
return param
4)eardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。注册的函数至少需要含有一个参数,这个参数实际上为服务器的响应,且函数中需要返回这个响应参数.
@app.teardown_request
def td_request(param):
return param
2、flask中表单的使用
(1)request.form获取POST请求中提交的表单数据
1)python代码如下:
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
return render_template('home.html')
@app.route('/signin', methods=['GET'])
def signin_form():
return render_template('form.html')
@app.route('/signin', methods=['POST'])
def signin():
# receive the data from submit
username = request.form['username']
password = request.form['password']
if username == 'admin' and password == 'password':
return render_template('signin-ok.html', username=username)
return render_template('form.html', message='Bad username or password', username=username)
if __name__ == '__main__':
app.run()
这个过程:第一次GET获取页面和表单,第二次POST提交表单进入if获得参数进行渲染
2) form.html中的内容如下:
Please Sign In
{% if message %}
{{ message }}
{% endif %}
(2)Flask-WTF扩展库处理Web表单
python代码:
from flask import Flask,render_template
from wtforms.validators import DataRequired
from flask_wtf import Form
from wtforms import SubmitField,StringField
app = Flask(__name__)
app.config['SECRET_KEY'] = 'ni cai' #这句代码很重要
class NameForm(Form):
name=StringField('your name',validators=[DataRequired])
submit=SubmitField('Submit')
@app.route('/',methods=['GET','POST'])
def index():
form=NameForm()
return render_template('test16.html',form=form)
if __name__ == '__main__':
app.run()
flask-wtf能保护所有表单免CSRF攻击,所以必须写密钥:
app.config['SECRET_KEY'] = 'ni cai'
test16.html:
Title
执行后截图:
3、Flash消息
当我们登录摸一个网站时,输入用户名和密码,如果密码输入错误,点击确定按钮后经常会出现一条提示密码错误的消息。这个消息就是flash消息,主要用来提示用户当前操作的结果。flask中也有自己的flash消息
1)flask开放了get_flashed_messages函数给模板使用,所谓开发就是我们可以在模板中直接使用,而不用import
Title
flashed message
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
2)python代码:
from flask import Flask,render_template,redirect,flash,session,url_for
from wtforms.validators import DataRequired
from flask_wtf import Form
from wtforms import SubmitField,StringField
app = Flask(__name__)
app.config['SECRET_KEY'] = 'ni cai' #这句代码很重要
class NameForm(Form):
name=StringField('your name',validators=[DataRequired])
submit=SubmitField('Submit')
@app.route('/',methods=['GET','POST'])
def index():
form=NameForm()
if form.validate_on_submit():
old_name = session.get('name')
if old_name is not None and old_name != form.name.data:
flash('name has been changed')
return redirect(url_for('test17'))
session['name'] = form.name.data
return render_template('test17.html', form=form)
return render_template('test17.html',form=form)
if __name__ == '__main__':
app.run()
3)执行结果
这是个失败的例子没有执行成功,后面有时间再弄吧!