博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python装饰器合并
阅读量:5759 次
发布时间:2019-06-18

本文共 2027 字,大约阅读时间需要 6 分钟。

hot3.png

不带参数的装饰器

@dec1@dec2def some(f):    pass

转换为一个装饰器

方法一

def composed(*decs):    def deco(f):        for dec in reversed(decs):            f = dec(f)        return f    return deco

然后使用

@composed(dec1, dec2)def some(f):    pass

 

方法二

def multiple_decorators(func):   return dec1(dec2(func))

然后使用

@multiple_decoratorsdef foo(): pass

 

方法三

def compose(f, g):    return lambda x: f(g(x))combined_decorator = compose(dec1, dec2)

然后使用

@combined_decoratordef f():    pass

 

带参数的装饰器合并

如:让flask 的@mod.route('/list')和@login_required合并

@mod.route('/standardization/
')@login_requireddef scriptstandardization(sid): pass

定义装饰器

from flask_login import login_requireddef needloginroute(mod,url, g=login_required):    return lambda x: mod.route(url)(g(x))

(支持更多参数的route)

def myroute(f,url, g=login_required, needlogin=True,**kwargs):    """必须登录的装饰器    @parma f:蓝图的mod    @parma url:路由url    @parma g:login_required装饰器    @param needlogin: True时为需要登录(默认)     """    if needlogin:        return lambda x: f.route(url,**kwargs)(g(x))    else:        return lambda x: f.route(url,**kwargs)(x)

然后使用

@needloginroute(mod, '/standardization/
')def scriptstandardization(sid): pass

当然;mod用的是蓝图

from flask import  Blueprintmod = Blueprint('script', __name__)

掌握原理即可,如a为f装饰器的参数,如b为g装饰器的参数,调用时候用compose作为装饰。

def compose(f, a, g, b):    return lambda x: f(a)(g(b)(x))

 

备注:

合并装饰器@mod.route('/')和@login_required会导致一个问题,eclipse pydev debug模式下修改代码需要重启才能生效,解决办法,直接在mod上写before_request登录验证,这样整个view页面需要登录的话就不需要加@login_required装饰器了。

和login_required的实现原理相同:

If there are only certain times you need to require that your user is

    logged in, you can do so with::

        if not current_user.is_authenticated:

            return current_app.login_manager.unauthorized()

from flask import current_appfrom flask_login import current_user@mod.before_requestdef before_request():    if not current_user.is_authenticated:        return current_app.login_manager.unauthorized()  # 没有认证返回login_manager.unauthorized装饰器函数的页面

 

转载于:https://my.oschina.net/yves175/blog/858684

你可能感兴趣的文章
开源中国动弹客户端实践(三)
查看>>
Win 8创造颠覆性体验:预览版关键更新
查看>>
vim在多文件中复制粘贴内容
查看>>
Android ContentObserver
查看>>
文章“关于架构优化和设计,架构师必须知道的事情”
查看>>
疯狂java学习笔记1002---非静态内部类
查看>>
ISA2006实战系列之一:实战ISA三种客户端部署方案(上)
查看>>
TCP服务器
查看>>
U-Mail邮件系统与泛微OA系统一体化操作指南
查看>>
AC旁挂三层交换机管理ap,二层接入ap心得
查看>>
JS中比较数字大小
查看>>
springcloud 学习-eureka搭建-为eureka添加认证
查看>>
jQuery插件的开发
查看>>
基础,基础,还是基础之JAVA基础
查看>>
如何成为一个C++高级程序员
查看>>
ant android 打包签名和渠道
查看>>
一个简单的接口,被调用并同步给出响应的方法
查看>>
Hadoop序列化与压缩
查看>>
我的友情链接
查看>>
显式锁(第十三章)
查看>>