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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。