不过艰辛的路显然不是光靠勇气就能踏开的,路上满是崴脚的石头。

钩子函数

钩子函数的意思即为在一个流程中,首先执行函数A然后执行函数B,如果函数C是钩子函数就能插队在中间执行A->C->B

before_request

如同函数名一样,该函数的作用是在请求之前执行的东东~在flask中,before_request函数实际上是一个装饰器,可以把需要设置成钩子函数的代码放在视图函数中执行

具体作用看代码吧:

app = Flask(__name__)

@app.before_request
def gouzi():
    print '6666666'
@app.route('/')
def index():
    return 'hello word'
app.run(debug=True)

当访问根目录后,pycharm打印出6666666,随后在网页中显示hello word,很明显gouzi()函数的作用就体现出来了,before_request的作用就是:在每次请求页面访问视图函数的时候,都执行一遍before_request装饰的函数(也就是钩子函数),基于这一点,可以使用这个做不常见情况下的权限验证。

context_processor

两个或者以上个不同的html页面,但是都需要传递同一个参数的话,可以每个页面都写一个视图函数,但是这样重复工作量,这个时候上下文处理器的功能就显示出来了。

需要注意的是,上下文其实和上面那个一样也是装饰器,可以装饰函数,但是被装饰的函数返回的结果对象必须要是一个字典才行。

当前目录下两个文件,run.py和index.html

# coding:utf-8
from flask import Flask,session,url_for,redirect,render_template
app = Flask(__name__,template_folder=(''),static_folder=('web/static'))
@app.context_processor
def contenx():
    user = 'admins'
    return {'username':user}

@app.route('/')
def index():
    return render_template('index.html')

app.run(debug=True)

html的内容如下

{{ username }}

在index视图函数中只是单纯的返回了模板页面,但是并没有传递参数进去,但是在html中却需要接受一个参数,重点在上面的上下文管理函数中,@app.context_processor装饰的下面的一个函数返回的对象是一个字典,其中字典的键值username:admins。这个时候访问首页显示admins。

可以看到虽然没有传递参数,但是依然显示出来了数据,因为context_processor是对全局上下文的内容进行管理,所以在其装饰的函数下返回的数据适用于全部的模板页面所需要的数据。