Django @login_required 用于类视图

Posted

技术标签:

【中文标题】Django @login_required 用于类视图【英文标题】:Django @login_required for class views 【发布时间】:2015-04-17 18:43:54 【问题描述】:

我继承了一个 Django(1.5.1) 项目,我需要在 @login_required 装饰器后面放置一个视图。这是我在views.py 中的内容:

我从here 获得了这个sn-p 代码,看起来它的目的是允许某人将@login_requireddecorator 应用于class

class LoginRequiredMixin(object):
    """
    View mixin which verifies that the user has authenticated.

    NOTE:
        This should be the left-most mixin of a view.
    """

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(*args, **kwargs)


class PermissionRequiredMixin(object):
    login_url = settings.LOGIN_URL
    permission_required = None
    raise_exception = False
    redirect_field_name = '/workers/'

    def dispatch(self, request, *args, **kwargs):
        # Verify class settings
        if self.permission_required == None or len(
            self.permission_required.split(".")) != 2:
            raise Error("'PermissionRequiredMixin' requires "
                "'permission_required' attribute to be set.")

        has_permission = request.user.has_perm(self.permission_required)

        if not has_permission:
            if self.raise_exception:
                return HttpResponseForbidden()
            else:
                path = urlquote(request.get_full_path())
                tup = self.login_url, self.redirect_field_name, path
                return HttpResponseRedirect("%s?%s=%s" % tup)

        return super(PermissionRequiredMixin, self).dispatch(
            request, *args, **kwargs)

然后我将其应用于我想要添加权限的视图:

class RootWorkerView(LoginRequiredMixin, PermissionRequiredMixin, APIView):
    renderer_classes = (WorkersJSONRenderer, JSONRenderer,
                        BrowsableAPIRenderer)

    def get(self, request):
        worker_list = rest_models.WorkerList(request)
        serializer = WorkerListSerializer(worker_list)
        return Response(serializer.data)

APIView 参数是一个结转,就像以前它是唯一的参数一样。它是否正确?

运行时,我什么也得不到。我要保护的视图模板显示时没有登录提示。

来自urls.py的相关sn-p:

url(r'^workers/$', views.RootWorkerView.as_view(),
    name='root_worker_view'),

url(r'^login/$', 'django.contrib.auth.views.login',
    'template_name': 'dashboard/login.html'),

/login/ 确实有效,我可以成功登录,所以这不是问题。

我觉得@method_decorator(login_required) 没有做好它的工作。有什么想法吗?

【问题讨论】:

我还没有仔细研究过你在做什么。但我认为通常 login_required 通过 url 定义应用于类视图。毕竟,它只是一个函数。你可以像这样包装login_required(MyClassView.as_view()) @Paul_R 这是一个有趣的想法,我今天会试一试,看看效果如何。 【参考方案1】:

你可以在urls.py中添加装饰器

from django.contrib.auth.decorators import login_required
 url(r'^workers/$', login_required(views.RootWorkerView.as_view()))

这对我有用。

【讨论】:

另外,如果你需要把这个装饰器的参数 login_url 写成这样: url(r'^workers/$', login_required(login_url='')(views.RootWorkerView.as_view() )) @NurzhanNogerbek 你的代码不工作。【参考方案2】:

现在你可以使用 Django 内置 LoginRequiredMixin

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
    login_url = '/login/'
    redirect_field_name = 'redirect_to'

https://docs.djangoproject.com/en/3.2/topics/auth/default/#the-loginrequired-mixin

【讨论】:

【参考方案3】:

我在关注页面尝试了这个问题。我终于解决了

Thanks to this documentation

我的解决方案:

views.py

class AddFollower(LoginRequiredMixin,View):    
    login_url = "/user/login/"

    
    def post(self,request,pk,*args,**kwargs):
        profile = Profile.objects.get(pk=pk)
        profile.following.add(self.request.user)
        return redirect('follower:profile-detail',pk=profile.pk)

urls.py

from django.urls 导入路径 从 。导入视图

app_name="follower"

urlpatterns = [
   
    path('detail/<pk>/',views.ProfileDetailView.as_view(),name='profile-detail'),
    path('<pk>/add',views.AddFollower.as_view(),name="add-follower"),
    path('<pk>/remove',views.RemoveFollower.as_view(),name="remove-follower"),
    
    ]

【讨论】:

以上是关于Django @login_required 用于类视图的主要内容,如果未能解决你的问题,请参考以下文章

Django内置auth模块中login_required装饰器用于类视图的优雅方式

Django@login_required用法简介

使用 @login_required 时的 Django 缓存

Django @login_required 删除 https

Django:使用@login_required 在视图上测试失败

Django:调整@login_required 装饰器