Python 需要Django许可

Python 需要Django许可,python,django,django-rest-framework,django-authentication,django-permissions,Python,Django,Django Rest Framework,Django Authentication,Django Permissions,我正在尝试检查一些API请求的权限。 我已经设置了auth users和auth_user_user_permissions以及auth_permissions表,如view_companyadd_companybla bla,但问题不在于此。问题是当我尝试使用装饰器时 @permission_required('API.view_company', raise_exception=True) 它对我说 AttributeError: 'CompanyDetailView' object ha

我正在尝试检查一些API请求的权限。 我已经设置了auth users和auth_user_user_permissions以及auth_permissions表,如
view_company
add_company
bla bla,但问题不在于此。问题是当我尝试使用装饰器时

@permission_required('API.view_company', raise_exception=True)
它对我说

AttributeError: 'CompanyDetailView' object has no attribute 'user'
很可能它正在寻找用户,因为它将检查用户权限是否可以查看公司,但我在URL.py(path('companys/',CompanyDetailView.as_view()),中声明的我的视图没有用户对象,这就是错误消息返回属性error的原因,我如何解决这个问题,非常感谢

我试着在视图类中设置一个示例用户,一开始,它是有效的,因为视图在寻找用户对象,我不能使用这种方式,因为每个请求都有不同的用户

import rest_framework
from rest_framework import status
from django.contrib.auth.models import User
from rest_framework.views import APIView
from rest_framework.response import Response
from django.contrib.auth.decorators import permission_required

class CompanyDetailView(APIView):
    @permission_required('api.view_company', raise_exception=True)
    def get(self, request, id):
        try:
            request_data = {}
            request_data['request_method'] = request.method
            request_data['id'] = id
            companies = Company.objects.get(id=id)
            status = rest_framework.status.HTTP_200_OK
            return Response(companies, status)
呜呜呜呜

url行为=

路径('companys/',CompanyDetailView.as_view()), 我的错误消息是:
AttributeError:'CompanyDetailView'对象没有属性'user'

当我调试并看到
request.user.has\u perm('view\u company')
返回false但api仍给出响应时,它假设根据此装饰器应用于函数视图的描述,您不允许查看公司,其中第一个参数是
request
,您尝试将其应用于类方法,其中第一个参数是
self
,在您的案例中是
CompanyDetailView
的实例,因此您得到了错误。您应该使用另一种方法来检查权限


您可以在这里阅读一些示例:

您不能轻松地将django权限与django rest框架一起使用

以下是关于django rest framework权限的教程:


Django视图和Django Rest框架视图的机制有点不同,这就是为什么会出现错误消息的原因
permission\u required
将尝试访问视图的
user
字段,以使用
has\u perm
方法检查用户权限。但是APIView中没有
user
字段

要解决这个问题,您可能需要使用Django Rest框架提供的限制访问的方法

但是,如果您仍然希望使用Django的内置权限来限制对视图的访问,则可以创建一个权限类,该类将使用
has_perm
来检查用户权限。像这样:

来自rest\u框架的导入权限
从rest_框架导入异常
类ViewCompanyPermission(权限.BasePermission):
def具有_权限(自我、请求、查看):
如果不是,则请求.user.has\u perm('api.view\u company'):
引发异常。权限被拒绝(“没有权限”)
返回真值
并通过
permission\u classes
字段在视图中使用它:

class CompanyDetailView(APIView):
权限\类=(ViewCompanyPermission,)
def get(自我、请求、id):
尝试:
请求_数据={}
请求数据['request\u method']=request.method
请求_数据['id']=id
companys=Company.objects.get(id=id)
status=rest\u framework.status.HTTP\u 200\u OK
返回响应(公司、状态)

如果您想复制所需的
权限\u
行为,可以执行以下操作:

来自rest\u框架的导入权限
从rest_框架导入异常
需要def权限(权限名称,引发异常=False):
需要类权限(permissions.BasePermission):
def具有_权限(自我、请求、查看):
如果没有,则请求.user.has\u perm(权限\u名称):
如果出现异常:
引发异常。权限被拒绝(“没有权限”)
返回错误
返回真值
需要返回许可证
然后你可以像这样使用它:

class CompanyDetailView(APIView):
权限类=(需要权限(“api.view\u company”,raise\u exception=True),)
# ...

共享来自django.db的
公司的模型导入来自api.models.base的模型导入BaseModel类公司(BaseModel):name=models.CharField(max_length=50,null=True)code=models.CharField(max_length=5,null=True,unique=True)是活动的=models.BooleanField(default=True)如果你说将用户关系添加到你的公司模型中,我不能。它假设检查请求用户,因为主要目的是,x个人请求api和get方法,这个x个人是否能够看到,重要的是x个人的用户权限首先,非常感谢,实际上我看到了问题和答案,但我猜我的情况与登录要求的不同。我已经检查了是否使用令牌控制系统登录,每个请求都必须带有spesific令牌,并且他们可以在将凭据发布到/auth_令牌url时获得令牌。我使用@permission\u required decorator的问题谢谢,我还是应该在def getno之前设置decorator。。那就不再需要装饰师了。但是我认为我的答案是不正确的,因为它是关于普通的django视图,而不是django rest框架工作。对不起,我仍然不适合我,因为我使用了“permission\u classes=[IsAuthenticated]raise\u exception=True permission\u required=('api.view\u company','api.add\u company')`,而且我还使用了CompanyDetailView(APIView,PermissionRequiredMixin)当我调试并看到request.user.has_perm('view_company')返回false但api仍给出响应时,它假设说您不允许查看公司