如何要求loginDjango通用视图?

我想限制对由Django Generic Views处理的URL的访问。

对于我的意见,我知道login_required装饰工作。 另外创build/删除/更新通用视图采用login_required参数,但我找不到一种方法为其他通用视图。

对于Django <1.5,您可以通过将函数包装到您的url中来添加装饰器,这允许您包装通用视图:

 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装饰器包装基于类的视图的视图function即可:

 login_required(TemplateView.as_view(template_name='foo_index.html')) 

Django 1.9或者使用django-braces

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中几乎相同的mixin,Django版本基于django-braces版本。 Django的大括号1.4.x仍然支持Django的1.4,所以你可以使用它与老版本。

老方法

我发现这个问题,同时Google如何装饰基于类的视图,所以要添加答案:

这在装饰基于视图的文档部分中有介绍。 有urls.py包装器,或者你可以将装饰器应用到dispatch()方法。 文档中的示例:

在URLconfiguration中进行装饰

 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) 

有关更多详细信息,请参阅上面链接的文档。

通用视图已经从函数改变为使用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'))), ) 

另外文档也描述了如何做到这一点。

如果你不想在有问题的通用视图(就像Aamirbuild议的那样)中编写你自己的薄包装,你也可以在你的urls.py文件中做这样的事情:

 from django.conf.urls.defaults import * # Directly import whatever generic views you're using and the login_required # decorator from django.views.generic.simple import direct_to_template from django.contrib.auth.decorators import login_required # In your urlpatterns, wrap the generic view with the decorator urlpatterns = patterns('', (r'', login_required(direct_to_template), {'template': 'index.html'}), # etc ) 

对于Django 1.11,你可以使用LoginRequiredMixin来实现基于类的视图

在设置文件中,你应该添加

 LOGIN_URL="/login/" 

在你的views.py

 from django.contrib.auth.mixins import LoginRequiredMixin class RestaurantLocationCreateView(LoginRequiredMixin,CreateView): .... 

我想要一个可重复使用的方法来要求对来自通用视图的许多视图进行authentication。 我创build了一个replace调度函数,我可以像添加其他声明一样添加到视图类中。

 class Index(generic.ListView): model = models.HomePage dispatch = auth.dispatch 

auth.dispatch是我们开展工作的地方:

 def dispatch(self, request, *args, **kw): """Mix-in for generic views""" if userSession(request): return super(self.__class__, self).dispatch(request, *args, **kw) # auth failed, return login screen response = user(request) response.set_cookie('afterauth', value=request.path_info) return response 

使用以下内容:

 from django.contrib.auth.decorators import login_required @login_required def your_view(): # your code here