菊花链式Python / Django自定义装饰器

萨奇布·阿里(Saqib Ali)

菊花链式Python / Django自定义装饰器好吗?并传递与收到的论点不同的论点?

我的许多Django视图功能都以完全相同的代码开始:

@login_required
def myView(request, myObjectID):
    try:
        myObj = MyObject.objects.get(pk=myObjectID)
    except:
        return myErrorPage(request)       

    try:
        requester = Profile.objects.get(user=request.user)
    except:
        return myErrorPage(request)

    # Do Something interesting with requester and myObj here

仅供参考,这是urls.py文件中的相应条目的样子:

url(r'^object/(?P<myObjectID>\d+)/?$', views.myView, ),

在许多不同的视图函数中重复相同的代码根本不是DRY。我想通过创建一个装饰器来对其进行改进,该装饰器将为我完成此重复性工作并使新的视图函数更整洁,如下所示:

@login_required
@my_decorator
def myView(request, requester, myObj):        
    # Do Something interesting with requester and myObj here

所以这是我的问题:

  1. 这是有效的做法吗?风格好吗?注意,我将更改myView()函数的签名。这对我来说有点奇怪和冒险。但我不确定为什么
  2. 如果我使多个这样的装饰器执行某些通用功能,但每个装饰器使用与接收到的装饰器不同的参数来调用包装的函数,则可以将它们以菊花链方式链接在一起吗?
  3. 如果上面的#1和#2可以,则最好的方式是向此myView的用户指示应传入的参数集(因为不再仅查看函数定义中的参数)确实有效)
Spinlok

1)是的,链接装饰器是有效的,因为其他答案已经指出。好的样式是主观的,但是我个人认为这会使您的代码更难为他人阅读。熟悉Django但不熟悉您的应用程序的人在使用您的代码时需要保持头脑清醒。我认为坚持框架约定以使您的代码尽可能可维护非常重要。

2)答案是肯定的,将不同的参数传递给包装函数在技术上是可以的,但是请考虑一个简单的代码示例,说明其工作方式:

def decorator1(func):
    def wrapper1(a1):
        a2 = "hello from decorator 1"
        func(a1, a2)
    return wrapper1

def decorator2(func):
    def wrapper2(a1, a2):
        a3 = "hello from decorator 2"
        func(a1, a2, a3)
    return wrapper2

@decorator1
@decorator2
def my_func(a1, a2, a3):
    print a1, a2, a3

my_func("who's there?")

# Prints:
# who's there?
# hello from decorator 1
# hello from decorator2

我认为,任何阅读此书的人都必须是一个心理运动员,才能在装饰器堆栈的每个级别上保留方法签名的上下文。

3)我将使用基于类的视图并重写dispatch()方法来设置实例变量,如下所示:

class MyView(View):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        self.myObj = ...
        self.requester = ...
        return super(MyView, self).dispatch(*args, **kwargs)

dispatch方法称为您的get()/post()方法。从Django文档中:

as_view入口点创建您的类的实例并调用其dispatch()方法。dispatch会检查请求以确定它是否是GET,POST等,并将请求转发给匹配的方法(如果已定义)

然后,您可以在您的get()和/或post()视图方法中访问这些实例变量这种方法的优点是您可以将其提取到基类中,并在任意数量的View子类中使用它。由于这是标准继承,因此它在IDE中的可追溯性也更高。

有关get()请求外观的示例

class MyView(View):
    def get(self, request, id):
        print 'requester is {}'.format(self.requester)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

菊花链式Python / Django自定义装饰器

来自分类Dev

菊花链式DisplayPort显示器

来自分类Dev

菊花链式两个显示器

来自分类Dev

使用自定义装饰器/属性记录Python Bottle API

来自分类Dev

表现出奇怪行为的Python自定义装饰器类

来自分类Dev

笔记本电脑上没有DisplayPort的菊花链式显示器

来自分类Dev

Nvidia Quadro 1000m是否支持DisplayPort 1.2-菊花链式显示器不起作用?

来自分类Dev

Python:int与列表的“链式定义”

来自分类Dev

如何在Django中制作自定义装饰器?

来自分类Dev

Django自定义权限方法或装饰器

来自分类Dev

服务器以django框架启动时如何运行自定义python代码?

来自分类Dev

TypeScript中的自定义装饰器

来自分类Dev

Tornado 中的自定义装饰器

来自分类Dev

更改Flask和自定义装饰器的顺序会破坏自定义装饰器

来自分类Dev

如何在自定义Pinax安装上修改Django的login_required装饰器?

来自分类Dev

制作自定义django视图装饰器(带有args)时遇到问题

来自分类Dev

Django:自定义管理网站类的管理员注册装饰器

来自分类Dev

Django-自定义装饰器,仅允许ajax请求

来自分类Dev

Django Rest框架中基于类的视图的自定义装饰器

来自分类Dev

Django Rest-将@action与自定义装饰器一起使用

来自分类Dev

Django中自定义构建装饰器的安全性问题

来自分类Dev

Django中自定义构建装饰器的条件设置问题

来自分类Dev

具有cache_page错误的Django自定义装饰器

来自分类Dev

Django Rest Framework 内部函数未在自定义装饰器中调用

来自分类Dev

定义自定义装饰器,例如staticmethod

来自分类Dev

Python自定义迭代器:非序列迭代

来自分类Dev

使用自定义引号的Python中的csv编写器

来自分类Dev

Python:使用自定义比较器对OrderedDict进行排序

来自分类Dev

Python自定义比较器如何工作?

Related 相关文章

  1. 1

    菊花链式Python / Django自定义装饰器

  2. 2

    菊花链式DisplayPort显示器

  3. 3

    菊花链式两个显示器

  4. 4

    使用自定义装饰器/属性记录Python Bottle API

  5. 5

    表现出奇怪行为的Python自定义装饰器类

  6. 6

    笔记本电脑上没有DisplayPort的菊花链式显示器

  7. 7

    Nvidia Quadro 1000m是否支持DisplayPort 1.2-菊花链式显示器不起作用?

  8. 8

    Python:int与列表的“链式定义”

  9. 9

    如何在Django中制作自定义装饰器?

  10. 10

    Django自定义权限方法或装饰器

  11. 11

    服务器以django框架启动时如何运行自定义python代码?

  12. 12

    TypeScript中的自定义装饰器

  13. 13

    Tornado 中的自定义装饰器

  14. 14

    更改Flask和自定义装饰器的顺序会破坏自定义装饰器

  15. 15

    如何在自定义Pinax安装上修改Django的login_required装饰器?

  16. 16

    制作自定义django视图装饰器(带有args)时遇到问题

  17. 17

    Django:自定义管理网站类的管理员注册装饰器

  18. 18

    Django-自定义装饰器,仅允许ajax请求

  19. 19

    Django Rest框架中基于类的视图的自定义装饰器

  20. 20

    Django Rest-将@action与自定义装饰器一起使用

  21. 21

    Django中自定义构建装饰器的安全性问题

  22. 22

    Django中自定义构建装饰器的条件设置问题

  23. 23

    具有cache_page错误的Django自定义装饰器

  24. 24

    Django Rest Framework 内部函数未在自定义装饰器中调用

  25. 25

    定义自定义装饰器,例如staticmethod

  26. 26

    Python自定义迭代器:非序列迭代

  27. 27

    使用自定义引号的Python中的csv编写器

  28. 28

    Python:使用自定义比较器对OrderedDict进行排序

  29. 29

    Python自定义比较器如何工作?

热门标签

归档