Flask之请求钩子的实现
请求钩子
通过装饰器为一个模块添加请求钩子,对当前模块的请求进行额外的处理.比如权限验证.
说白了,就是在执行视图函数前后你可以进行一些处理,Flask使用装饰器为我们提供了注册通用函数的功能。
1、before_first_request:在处理第一个请求前执行
before_first_request
在对应用程序实例的第一个请求之前注册要运行的函数,只会执行一次
#:Alistsoffunctionsthatshouldbecalledatthebeginningofthe #:firstrequesttothisinstance.Toregisterafunctionhere,use #:the:meth:`before_first_request`decorator. #: #:..versionadded::0.8 self.before_first_request_funcs=[] @setupmethod defbefore_first_request(self,f): """Registersafunctiontoberunbeforethefirstrequesttothis instanceoftheapplication. ..versionadded::0.8 """ self.before_first_request_funcs.append(f)
将要运行的函数存放到before_first_request_funcs属性中进行保存
2、before_request:在每次请求前执行
在每个请求之前注册一个要运行的函数,每一次请求都会执行
#:Adictionarywithlistsoffunctionsthatshouldbecalledatthe
#:beginningoftherequest.Thekeyofthedictionaryisthenameof
#:theblueprintthisfunctionisactivefor,`None`forallrequests.
#:Thiscanforexamplebeusedtoopendatabaseconnectionsor
#:gettingholdofthecurrentlyloggedinuser.Toregistera
#:functionhere,usethe:meth:`before_request`decorator.
self.before_request_funcs={}
@setupmethod
defbefore_request(self,f):
"""Registersafunctiontorunbeforeeachrequest."""
self.before_request_funcs.setdefault(None,[]).append(f)
returnf
将要运行的函数存放在字典中,None为键的列表中存放的是整个应用的所有请求都要运行的函数.
3、after_request:每次请求之后调用,前提是没有未处理的异常抛出
在每个请求之后注册一个要运行的函数,每次请求都会执行.需要接收一个Response类的对象作为参数并返回一个新的Response对象或者直接返回接受到的Response对象
#:Adictionarywithlistsoffunctionsthatshouldbecalledafter
#:eachrequest.Thekeyofthedictionaryisthenameoftheblueprint
#:thisfunctionisactivefor,`None`forallrequests.Thiscanfor
#:examplebeusedtoopendatabaseconnectionsorgettingholdofthe
#:currentlyloggedinuser.Toregisterafunctionhere,usethe
#::meth:`after_request`decorator.
self.after_request_funcs={}
@setupmethod
defafter_request(self,f):
"""Registerafunctiontoberunaftereachrequest.Yourfunction
musttakeoneparameter,a:attr:`response_class`objectandreturn
anewresponseobjectorthesame(see:meth:`process_response`).
AsofFlask0.7thisfunctionmightnotbeexecutedattheendofthe
requestincaseanunhandledexceptionoccurred.
"""
self.after_request_funcs.setdefault(None,[]).append(f)
returnf
4、teardown_request:每次请求之后调用,即使有未处理的异常抛出
注册一个函数在每个请求的末尾运行,不管是否有异常,每次请求的最后都会执行.
#:Adictionarywithlistsoffunctionsthatarecalledafter
#:eachrequest,evenifanexceptionhasoccurred.Thekeyofthe
#:dictionaryisthenameoftheblueprintthisfunctionisactivefor,
#:`None`forallrequests.Thesefunctionsarenotallowedtomodify
#:therequest,andtheirreturnvaluesareignored.Ifanexception
#:occurredwhileprocessingtherequest,itgetspassedtoeach
#:teardown_requestfunction.Toregisterafunctionhere,usethe
#::meth:`teardown_request`decorator.
#:
#:..versionadded::0.7
self.teardown_request_funcs={}
@setupmethod
defteardown_request(self,f):
"""Registerafunctiontoberunattheendofeachrequest,
regardlessofwhethertherewasanexceptionornot.Thesefunctions
areexecutedwhentherequestcontextispopped,evenifnotan
actualrequestwasperformed.
"""
self.teardown_request_funcs.setdefault(None,[]).append(f)
returnf
将要运行的函数存放在字典中,None为键的列表中存放的是整个应用的所有请求都要运行的函数.
fromflaskimportFlask
app=Flask(__name__)
@app.before_first_request
defbefore_first_request():
print('before_first_request')
@app.before_request
defbefore_request():
print('before_request')
@app.after_request
defafter_request(resp):
print('after_request')
returnresp
@app.teardown_request
defteardown_request(e):
print('teardown_request')
@app.route("/")
defview_fn():
return"view_fn"
if__name__=="__main__":
app.run()
第一次请求:
页面输出:view_fn
控制台输出:before_first_request
before_request
after_request
teardown_request
第二次请求:
页面输出:view_fn
控制台输出:before_request
after_request
teardown_request
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。