python3+flask 开发web(六)——4中请求钩子和Flask-WTF扩展库处理

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()

执行结果如下:

python3+flask 开发web(六)——4中请求钩子和Flask-WTF扩展库处理_第1张图片

如果不写@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()

​

执行结果:

python3+flask 开发web(六)——4中请求钩子和Flask-WTF扩展库处理_第2张图片

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 %}
Please sign in:

(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


{{form.hidden_tag()}} {{form.name.label}}{{form.name()}} {{form.submit }}

执行后截图:

python3+flask 开发web(六)——4中请求钩子和Flask-WTF扩展库处理_第3张图片

3、Flash消息

当我们登录摸一个网站时,输入用户名和密码,如果密码输入错误,点击确定按钮后经常会出现一条提示密码错误的消息。这个消息就是flash消息,主要用来提示用户当前操作的结果。flask中也有自己的flash消息

1)flask开放了get_flashed_messages函数给模板使用,所谓开发就是我们可以在模板中直接使用,而不用import




    
    Title


{{form.hidden_tag()}}

{{form.name.label}}

{{form.name()}}
{{form.submit }}
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)执行结果

python3+flask 开发web(六)——4中请求钩子和Flask-WTF扩展库处理_第4张图片

这是个失败的例子没有执行成功,后面有时间再弄吧!

你可能感兴趣的:(python学习)