Flask框架之钩子函数

钩子函数

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

发布了354 篇原创文章 · 获赞 4 · 访问量 7822

猜你喜欢

转载自blog.csdn.net/weixin_44733660/article/details/103968882