我想限制对Django泛型视图处理的URL的访问。
就我的观点而言,我知道login_required
decorator可以完成这项工作。创建/删除/更新泛型视图也需要login_required
参数,但是我找不到一种方法来处理其他泛型视图。
发布于 2010-01-27 00:12:52
对于Django < 1.5,您可以通过将函数包装在urls中来添加装饰器,这允许您包装通用视图:
from django.contrib.auth.decorators import login_required
from django.views.generic.simple import direct_to_template
urlpatterns = patterns('',
(r'^foo/$', login_required(direct_to_template), {'template': 'foo_index.html'}),
)
基于函数的通用视图在Django 1.4中被弃用,并在Django 1.5中被删除。但同样的原理也适用,只是用login_required
装饰器包装了基于类的视图的视图函数:
login_required(TemplateView.as_view(template_name='foo_index.html'))
发布于 2013-02-05 22:27:03
Django >= 1.9或使用django->=
Django 1.9引入了一个LoginRequiredMixin
,它的用法如下:
from django.contrib.auth.mixins import LoginRequiredMixin
class MyView(LoginRequiredMixin, View):
login_url = '/login/'
redirect_field_name = 'redirect_to'
如果你使用的是一个旧版本的django,你可以使用与django-braces几乎相同的混合-- Django版本是基于django- based版本的。django-braces 1.4.x still supports Django 1.4,所以你可以在相当老的版本中使用它。
较旧的方法
当我在谷歌上搜索如何装饰基于类的视图时,我发现了这个问题,所以添加这个问题的答案:
decorating class based views上的文档部分对此进行了介绍。这里有urls.py
包装器,或者您可以将装饰器应用于dispatch()
方法。文档中的示例:
在URL conf中进行装饰
from django.contrib.auth.decorators import login_required, permission_required
from django.views.generic import TemplateView
from .views import VoteView
urlpatterns = patterns('',
(r'^about/', login_required(TemplateView.as_view(template_name="secret.html"))),
(r'^vote/', permission_required('polls.can_vote')(VoteView.as_view())),
)
装饰类
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
class ProtectedView(TemplateView):
template_name = 'secret.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(ProtectedView, self).dispatch(*args, **kwargs)
有关更多详细信息,请参阅上面链接的文档。
发布于 2011-05-05 08:17:21
在Django 1.3版本中,通用视图已从函数更改为对象。因此,需要对Will McCutchen和Will Hardy进行一些微小的更改,以与1.3版一起工作:
from django.contrib.auth.decorators import login_required
from django.views.generic import TemplateView
urlpatterns = patterns('',
(r'^foo/$', login_required(TemplateView.as_view(template_name='foo_index.html'))),
)
此外,documentation还描述了如何做到这一点。
https://stackoverflow.com/questions/2140550
复制相似问题