如何将装饰器应用于django中的所有视图(模块)

时间:2013-05-21 07:59:05

标签: django python-decorators

当特定模块中的所有视图仅在用户被授权时才可用时,或者他们都应该进行相同的检查时,它会发生很多。

我怎样才能避免在整个文件中重复注释?

4 个答案:

答案 0 :(得分:6)

在你的网址

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

答案 1 :(得分: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

答案 2 :(得分:1)

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

另请参阅:decorating-all-django-admin-views-1-4

答案 3 :(得分:0)

当需要添加许多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
]