9

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

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

4

4 回答 4

8

在您的网址中

url(r'someregexp/$', mydecorator(view.myview.dude), 'name_of_view'),
于 2013-05-21T08:02:08.227 回答
2

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

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
于 2013-05-21T09:11:01.010 回答
1

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

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

于 2013-05-21T08:02:43.483 回答
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
]
于 2019-07-30T10:46:05.777 回答