Flask框架各种常见装饰器示例


Posted in Python onJuly 17, 2018

本文实例讲述了Flask框架各种常见装饰器。分享给大家供大家参考,具体如下:

效果类似django的process_request的装饰器

@app.before_request
def before(*args,**kwargs):
  print('请求之前')
  '''
  如果允许通过访问,可以return None
  该装饰器装饰的函数如果有return其他内容则直接结束访问,
  效果有点类似django的process_reqeust中间件方法。
  比如通过这个装饰器写登陆验证,判断其是否有session,没有则不允许访问,有则继续访问
  然后通过request.path判断访问的函数,如果是登陆(白名单)则通过。
  request.url 是完整的url
  request.path是域名后面的url正则
  '''
  if request.path == '/login':
    return None
  user = session.get('user_info')
  if user:
    return None
  return redirect('/login')

类似process_response

@app.after_request
def after(response):
  #效果和process_response是一样的,必须有返回值,没有则报错。
  print('我走了')
  return response

flask中间件装饰器执行顺序。

如果多个app.before_requestapp.after_request

那么执行顺序也和django类似,

app.before_request是按照从上而下执行(文件的上下),app.after_request是自下而上执行。

如果在app.before_requestreturn了其他内容,请求被拦截,那么不会执行视图函数,

直接从最后一个app.after_reqeust倒着开始执行所有after_request

自定义错误页面:

@app.error_handlers(404)
def error_404(arg):
  '''自定义错误页面,根据状态码定制'''
  return "404错误啦"

模板中定制方法:

前端直接调用后端函数的装饰器:

@app.template_global()
def xx(a1,a2):
  return a1+a2
'''
这个装饰器的作用就是,可以在前端直接通过{{ xx(1,2)}}来调用后端的这个函数。
'''

相当于filter的装饰器

@app.template_filter()
def db(a1,a2,a3):
  return a1+a2+a3
'''
效果和django的Filter相似,前端渲染的时候需要注意写法
{{ 1|db(2,3)}} 1是第一个参数,后面是2,3参数。
'''

第一次来请求操作的装饰器:

@app.before_first_request
def first(*args,**kwargs):
  pass
'''
只有第一次请求时候才执行的函数装饰器
'''

Flask的中间件一般感觉用处不大,不如装饰器方便

Flask框架各种常见装饰器示例

通过重新复制app.wsgi_app

重写这个类的__call__方法,如上图,只是增加了两个打印,效果同process_request,process_response

更多关于Python相关内容可查看本站专题:《Python入门与进阶经典教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python程序语言快速上手教程
Jul 18 Python
python client使用http post 到server端的代码
Feb 10 Python
python实现自动登录人人网并访问最近来访者实例
Sep 26 Python
使用Python生成url短链接的方法
May 04 Python
对于Python装饰器使用的一些建议
Jun 03 Python
python抓取并保存html页面时乱码问题的解决方法
Jul 01 Python
如何将python中的List转化成dictionary
Aug 15 Python
Python函数装饰器常见使用方法实例详解
Mar 30 Python
python 图片去噪的方法示例
Jul 09 Python
tensorflow 保存模型和取出中间权重例子
Jan 24 Python
构建高效的python requests长连接池详解
May 02 Python
使用Python实现音频双通道分离
Dec 25 Python
详解基于django实现的webssh简单例子
Jul 17 #Python
Python爬虫之网页图片抓取的方法
Jul 16 #Python
python编辑用户登入界面的实现代码
Jul 16 #Python
python 反向输出字符串的方法
Jul 16 #Python
解决python3 urllib 链接中有中文的问题
Jul 16 #Python
如何用Python实现简单的Markdown转换器
Jul 16 #Python
详解python里的命名规范
Jul 16 #Python
You might like
生成卡号php代码
2008/04/09 PHP
PHP实现懒加载的方法
2015/03/07 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
javascript 框架小结 个人工作经验
2009/06/13 Javascript
在多个页面使用同一个HTML片段的代码
2011/03/04 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
jQuery实现的图片点击放大缩小功能案例
2020/01/02 jQuery
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python实现中文输出的两种方法
2015/05/09 Python
Python科学计算之NumPy入门教程
2017/01/15 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
Python使用requests发送POST请求实例代码
2018/01/25 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
德国购买门票网站:ADticket.de
2019/10/31 全球购物
领导证婚人证婚词
2014/01/13 职场文书
作风整顿剖析材料
2014/09/30 职场文书
学生保证书
2015/01/16 职场文书
网络舆情信息简报
2015/07/21 职场文书
什么是Python装饰器?如何定义和使用?
2022/04/11 Python