gpt4 book ai didi

django - 如何在基于 Django 类的 View 上使用 permission_required 装饰器

转载 作者:行者123 更新时间:2023-11-28 19:32:21 31 4
gpt4 key购买 nike

我在理解新 CBV 的工作原理时遇到了一些困难。我的问题是,我需要在所有 View 中要求登录,并且在其中一些 View 中需要特定权限。在基于函数的 View 中,我使用 View 中的 @permission_required() 和 login_required 属性来执行此操作,但我不知道如何在新 View 上执行此操作。 django 文档中是否有某些部分对此进行了解释?我什么也没找到。我的代码有什么问题?

我尝试使用@method_decorator 但它回复“TypeError at/spaces/prueba/_wrapped_view() takes at least 1 argument (0 given)

这是代码(GPL):

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required

class ViewSpaceIndex(DetailView):

"""
Show the index page of a space. Get various extra contexts to get the
information for that space.

The get_object method searches in the user 'spaces' field if the current
space is allowed, if not, he is redirected to a 'nor allowed' page.
"""
context_object_name = 'get_place'
template_name = 'spaces/space_index.html'

@method_decorator(login_required)
def get_object(self):
space_name = self.kwargs['space_name']

for i in self.request.user.profile.spaces.all():
if i.url == space_name:
return get_object_or_404(Space, url = space_name)

self.template_name = 'not_allowed.html'
return get_object_or_404(Space, url = space_name)

# Get extra context data
def get_context_data(self, **kwargs):
context = super(ViewSpaceIndex, self).get_context_data(**kwargs)
place = get_object_or_404(Space, url=self.kwargs['space_name'])
context['entities'] = Entity.objects.filter(space=place.id)
context['documents'] = Document.objects.filter(space=place.id)
context['proposals'] = Proposal.objects.filter(space=place.id).order_by('-pub_date')
context['publication'] = Post.objects.filter(post_space=place.id).order_by('-post_pubdate')
return context

最佳答案

the CBV docs 中列出了一些策略:

urls.py ( docs ) 中实例化 View 时装饰 View

from django.contrib.auth.decorators import login_required

urlpatterns = [
path('view/',login_required(ViewSpaceIndex.as_view(..)),
...
]

装饰器是在每个实例的基础上应用的,因此您可以根据需要在不同的 urls.py 路由中添加或删除它。

装饰你的类,使你的 View 的每个实例都被包装(docs)

有两种方法:

  1. method_decorator 应用于您的 CBV 调度方法,例如,

     from django.utils.decorators import method_decorator
    from django.contrib.auth.decorators import login_required

    @method_decorator(login_required, name='dispatch')
    class ViewSpaceIndex(TemplateView):
    template_name = 'secret.html'

如果你使用 Django < 1.9(你不应该,它不再受支持)你不能在类上使用 method_decorator,所以你必须覆盖 dispatch 手动方法:

    from django.contrib.auth.decorators import login_required

class ViewSpaceIndex(TemplateView):

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(ViewSpaceIndex, self).dispatch(*args, **kwargs)
  1. 使用类似 django.contrib.auth.mixins.LoginRequiredMixin 的混入在这里的其他答案中概述得很好:

     from django.contrib.auth.mixins import LoginRequiredMixin

    class MyView(LoginRequiredMixin, View):

    login_url = '/login/'
    redirect_field_name = 'redirect_to'

确保将 mixin 类放在继承列表的第一位(以便 Python 的 Method Resolution Order algorithm 选择正确的东西)。

文档中解释了您收到 TypeError 的原因:

Note:method_decorator passes *args and **kwargs as parameters to the decorated method on the class. If your method does not accept a compatible set of parameters it will raise a TypeError exception.

关于django - 如何在基于 Django 类的 View 上使用 permission_required 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6069070/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com