【问题标题】:How to apply a decorator to all views (of a module) in django如何将装饰器应用于 django 中的所有视图(模块的)
【发布时间】:2013-05-15 22:04:39
【问题描述】:

这种情况经常发生,当特定模块中的所有视图都应该只有在用户获得授权时才可用,或者它们都应该进行相同的检查时。

如何避免在整个文件中重复注释?

【问题讨论】:

    标签: django python-decorators


    【解决方案1】:

    在您的网址中

    url(r'someregexp/$', mydecorator(view.myview.dude), 'name_of_view'),
    

    【讨论】:

    • 实际上这只是将注释移动到控制器。你会想要包装 include 语句
    • 是的,当然,但我认为这更好,因为它具有可读性和可维护性。我认为使用中间件(正如我之前通常提倡的那样,因为我认为它们很棒)不应该为此负责。它会引入一层额外的复杂性,并且还会干扰可能不受规则约束但逻辑上需要存在于特定应用程序views.py 中的视图。但是您是 100% 正确的,因为它将装饰器从 views.py 移动到 urls.py。
    • 我知道,只是向 OP 指出这一点,我同意这更加明确和透明 :-)
    • 是的,我认为你会 :) 但我认为我应该为我的回答提供一些论据,我认为这是建设性的批评! :)
    【解决方案2】:

    使用基于类的视图时,您可以为所有这些视图创建一个基类/mixin,以实现所需的功能(也使用decorators),然后让所有视图都继承自这个基础视图。

    from django.views.generic import TemplateView
    
    class BaseView(TemplateView):
    
        def get(self, request, *args, **kwargs):
            # do some checking here
            if not request.user.is_authenticated():
                # do something if anonymous user
            return super(BaseView, self).get(request, *args, **kwargs)
    
    
    class MyView(BaseView):
        pass
    

    【讨论】:

      【解决方案3】:

      您可以编写一个调度程序,但如果您有很多模块的 url,那么创建一个middleware 层可能会更方便。

      另见:decorating-all-django-admin-views-1-4

      【讨论】:

        【解决方案4】:

        当需要添加很多 url 时,最好将装饰器包装在一个函数中并调用该函数。

        from django.conf.urls import re_path
        from . import views
        from somewhere import decorator
        
        
        def url_with_decorator(regex, view, kwargs=None, name=None):
            return re_path(regex, decorator(view), kwargs, name)
        
        urlpatterns = [
            url_with_decorator(r'^$', views.index, name='index'),
            url_with_decorator(r'^any_thing$', views.any_view, name='index'),
            # TODO: add url here
        ]
        

        【讨论】:

          猜你喜欢
          • 2023-02-07
          • 2016-09-16
          • 2021-07-12
          • 1970-01-01
          • 2020-11-30
          • 2017-03-08
          • 1970-01-01
          • 2014-06-01
          • 1970-01-01
          相关资源
          最近更新 更多