钩子函数
在Flask
中钩子函数
是使用特定
的装饰器装饰的函数
。
为什么叫做钩子函数
呢,是因为钩子函数
可以在正常执行的代码中,插入一段自己想要执行的代码。那么这种函数就叫做钩子函数
。
常见的钩子函数
1、before_first_request
处理项目的第一次请求之前
执行。
@app.before_first_request
def first_request():
print 'first time request'
2、before_request
(使用较多)
在每次请求之前
执行。
通常可以用这个装饰器来给视图函数增加一些变量。请求已经到达了Flask
,但是还没有进入到具体的视图函数之前调用。
一般这个就是在视图函数之前,将一些后面需要用到的数据先处理好,方便视图函数使用。
@app.before_request
def before_request():
if not hasattr(g,'glo1'):
setattr(g,'glo1','想要设置的')
3、teardown_appcontext
(使用少)
不管是否有异常
,注册的函数
都会在每次
请求之后执行。
@app.teardown_appcontext
def teardown(exc=None):
if exc is None:
db.session.commit()
else:
db.session.rollback()
db.session.remove()
4、template_filter
在使用Jinja2模板的时候自定义过滤器。
@app.template_filter("upper")
def upper_filter(s):
return s.upper()
5、context_processor
上下文处理器
。
使用这个钩子函数,必须返回一个字典
。这个字典中的值在所有模版中都可以使用。
这个钩子函数的函数是,如果一些在很多模版中都要用到的变量
,那么就可以使用这个钩子函数来返回,而不用在每个视图函数中的render_template
中去写,这样可以让代码更加简洁和好维护。
from flask import Flask,request,session,current_app,url_for,g,render_template
import os
app = Flask(__name__)
#加盐 混淆原数据的作用
app.config['SECRET_KEY']=os.urandom(24)
@app.route('/')
def hello_world():
print("hi")
session['uname']="wukong"
return render_template("index.html")
@app.route('/li')
def mylist():
print("mylist")
# print("直接取出",g.user)
if hasattr(g,"user"):
print("条件取出", g.user)
return render_template('list.html')
@app.before_request
def before_request():
#场景:若用户已经登录了,验证时把用户名放入session中,之后取出来,放入钩子函数
#以后访问的视图函数中可直接取出来使用
uname = session.get('uname')
print(uname)
if uname:
g.user = uname
@app.context_processor
def context_processor():
if hasattr(g,'user'):
return {"current_user":g.user}
else:
return {}
if __name__ == '__main__':
app.run(debug=True)
6、errorhandler
errorhandler
接收状态码,可以自定义返回这种状态码的响应的处理方法。
在发生一些异常的时候,比如304错误,比如500错误,那么如果想要优雅的处理这些错误,就可以使用errorhandler
来出来。
常见的404错误处理:
from flask import Flask,request,session,current_app,url_for,g,render_template,abort
import os
app = Flask(__name__)
@app.route('/li')
def mylist():
print("mylist")
if hasattr(g,"user"):
print("条件取出", g.user)
return render_template('list.html')
#多数是访问页面不存在时出现的错误
@app.errorhandler(404)
def page_not_found(error):
return render_template('404.html'),404
if __name__ == '__main__':
app.run()
常见的500错误处理:
from flask import Flask,request,session,current_app,url_for,g,render_template,abort
import os
app = Flask(__name__)
#加盐 混淆原数据的作用
app.config['SECRET_KEY']=os.urandom(24)
@app.route('/')
def hello_world():
print("hi")
session['uname']="wukong"
#制造一个500错误
print(g.user)
return render_template("index.html")
@app.route('/li')
def mylist():
print("mylist")
if hasattr(g,"user"):
print("条件取出", g.user)
return render_template('list.html')
@app.errorhandler(500)
def server_error(error):
return render_template('500.html'),500
if __name__ == '__main__':
app.run()
Flask中的abort函数可以手动的抛出相应的错误(如400):
from flask import Flask,request,session,current_app,url_for,g,render_template,abort
import os
app = Flask(__name__)
#加盐 混淆原数据的作用
app.config['SECRET_KEY']=os.urandom(24)
@app.route('/')
def hello_world():
print("hi")
session['uname']="wukong"
return render_template("index.html")
@app.errorhandler(400)
def args_error(error):
return '您的参数不正确',400
#该功能需要先登录才能访问
@app.route('/setting/')
def setting():
uname = session.get("uname")
if uname :
return '欢迎来到设置页面'
else: # 如果没有登录,这时候我就让他跳转到400错误
abort(400)
return render_template('list.html')
if __name__ == '__main__':
app.run()