文档章节

python装饰器合并

python-yzw
 python-yzw
发布于 2017/03/14 17:46
字数 446
阅读 58
收藏 1

不带参数的装饰器

@dec1
@dec2
def 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_decorators
def foo(): pass

 

方法三

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

combined_decorator = compose(dec1, dec2)

然后使用

@combined_decorator
def f():
    pass

 

带参数的装饰器合并

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

@mod.route('/standardization/<sid>')
@login_required
def scriptstandardization(sid):
    pass

定义装饰器

from flask_login import login_required

def 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/<sid>')
def scriptstandardization(sid):
    pass

当然;mod用的是蓝图

from flask import  Blueprint
mod = 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_app
from flask_login import current_user

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

 

© 著作权归作者所有

python-yzw
粉丝 4
博文 91
码字总数 43773
作品 0
深圳
程序员
私信 提问
Python知识点:理解和使用装饰器 @decorator

我在我的个人博客“猿人学网站”和公众号“猿人学Python”上写Python教程,有兴趣的可以关注公众号和网站。 Python的装饰器(decorator)是一个很棒的机制,也是熟练运用Python的必杀技之一。...

呆木木人儿
03/12
1K
3
一份来自 StackOverflow 的最佳 Python 装饰器教程

(给Python开发者加星标,提升Python技能) 翻译:可乐,校对:艾凌风 发布:Python开发者(id:PythonCoder) 注意: 这是一篇 StackOverflow 上的问题回答,因为这个回答很棒,所以我把它存...

Python开发者
04/25
0
0
Python的装饰器原来是这么用的

公众号:pythonislover Python的装饰器,是一个Python中一个比较难以理解的知识点, 今天我试试说一说,说的如果不好,请见谅。 装饰器,从字面意思来说,就是修饰一个事物的,在Python里面的...

南山yrg
04/30
0
0
转载:唐磊的个人博客《python中decorator详解》【转注:深入浅出清晰明了】

转载请注明来源:唐磊的个人博客《python中decorator详解》 前面写python的AOP解决方案时提到了decorator,这篇文章就详细的来整理下python的装饰器——decorator。 python中的函数即objects...

laugh2last
2015/08/17
1K
0
Bottle 框架中的装饰器类和描述符应用

最近在阅读Python微型Web框架Bottle的源码,发现了Bottle中有一个既是装饰器类又是描述符的有趣实现。刚好这两个点是Python比较的难理解,又混合在一起,让代码有些晦涩难懂。但理解代码之后...

大数据之路
2012/09/23
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
今天
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
5
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部