Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django REST权限不返回403_Python_Django_Django Rest Framework - Fatal编程技术网

Python Django REST权限不返回403

Python Django REST权限不返回403,python,django,django-rest-framework,Python,Django,Django Rest Framework,我现在正在Django REST3.5上创建一个测试用例 这是我的tests.py 问题: 它返回201,而不是403。我不希望创建对象 import os import pytest from rest_framework.test import APIClient from apps.price_list_excel_files.models import PriceListExcelFile def upload_excel(user: str, passwd: str) ->

我现在正在Django REST3.5上创建一个测试用例
这是我的
tests.py

问题
它返回
201
,而不是
403
。我不希望创建对象

import os

import pytest
from rest_framework.test import APIClient

from apps.price_list_excel_files.models import PriceListExcelFile


def upload_excel(user: str, passwd: str) -> tuple:
    client = APIClient()
    client.login(username=user, password=passwd)

    dir_path = os.path.dirname(os.path.realpath(__file__))
    with open(dir_path + '/mixed_case.xlsx', 'rb') as fp:
        response = client.post(
            '/api/price-list-excel-files/',
            {'file': fp},
            format='multipart'
        )
    return client, response

def test_service_manager_upload_excel(prepare_service_mgrs):
    client, response = upload_excel("smgr1", "smgr1password")
    assert 403 == response.status_code
    assert 0 == PriceListExcelFile.objects.count()
models.py

from django.db import models
from django.db.models.signals import post_save

from apps.commons.models import AbstractModelController
from apps.price_list_excel_files.permissions import PriceListExcelFilePermisionMixin
from apps.price_list_excel_files.validators import validate_file_extension, validate_head_columns
from apps.price_lists.utils import get_xlsx2db


class PriceListExcelFile(AbstractModelController, PriceListExcelFilePermisionMixin):
    """
    A table that store the file record in the system
    Feature from Access Level. View is user be able to download an Excel file
                            Price list
    Service MGR             View
    Service Staff           View
    """
    file = models.FileField(upload_to='./excels', validators=[validate_file_extension, validate_head_columns])

    class Meta:
        ordering = ['-id']


post_save.connect(get_xlsx2db, sender=PriceListExcelFile)
权限.py

from apps.accounting_users.models import AccountingUser
from apps.marketing_users.models import MarketingUser
from apps.mgmt_users.models import ManagementUser


class PriceListExcelFilePermisionMixin:
    @staticmethod
    def has_read_permission(request):
        return True

    def has_object_read_permission(self, request):
        return True

    @staticmethod
    def has_write_permission(request):
        import pdb;
        pdb.set_trace()
        if request.user.is_anonymous():
            return False
        else:
            return ManagementUser.objects.filter(user=request.user).exists() or \
                   AccountingUser.objects.filter(user=request.user).exists() or \
                   MarketingUser.objects.filter(user=request.user).exists()
from django.urls import reverse_lazy
from django.views.generic import CreateView
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm


    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
> /Users/el/.pyenv/versions/3.6.0/envs/siam-sbrand/lib/python3.6/site-packages/rest_framework/mixins.py(28)get_success_headers()
-> def get_success_headers(self, data):
(Pdb) list
 23             return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
 24
 25         def perform_create(self, serializer):
 26             serializer.save()
 27
 28  ->     def get_success_headers(self, data):
 29             try:
 30                 return {'Location': data[api_settings.URL_FIELD_NAME]}
 31             except (TypeError, KeyError):
 32                 return {}
 33
(Pdb) api_settings.URL_FIELD_NAME
'url'
(Pdb) data
{'id': 1, 'file': 'http://testserver/media/excels/mixed_case_bYU8C82.xlsx', 'permissions': {'write': False, 'read': True}}
(Pdb) data[api_settings.URL_FIELD_NAME]
*** KeyError: 'url'
from django.urls import reverse_lazy
from django.views.generic import CreateView
from dry_rest_permissions.generics import DRYPermissions
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    permission_classes = (DRYPermissions,)
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm

    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
def test_service_manager_upload_excel(prepare_service_mgrs):
    client, response = upload_excel("smgr1", "smgr1password")
    assert 403 == response.status_code
    assert 0 == PriceListExcelFile.objects.count()
视图.py

from apps.accounting_users.models import AccountingUser
from apps.marketing_users.models import MarketingUser
from apps.mgmt_users.models import ManagementUser


class PriceListExcelFilePermisionMixin:
    @staticmethod
    def has_read_permission(request):
        return True

    def has_object_read_permission(self, request):
        return True

    @staticmethod
    def has_write_permission(request):
        import pdb;
        pdb.set_trace()
        if request.user.is_anonymous():
            return False
        else:
            return ManagementUser.objects.filter(user=request.user).exists() or \
                   AccountingUser.objects.filter(user=request.user).exists() or \
                   MarketingUser.objects.filter(user=request.user).exists()
from django.urls import reverse_lazy
from django.views.generic import CreateView
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm


    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
> /Users/el/.pyenv/versions/3.6.0/envs/siam-sbrand/lib/python3.6/site-packages/rest_framework/mixins.py(28)get_success_headers()
-> def get_success_headers(self, data):
(Pdb) list
 23             return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
 24
 25         def perform_create(self, serializer):
 26             serializer.save()
 27
 28  ->     def get_success_headers(self, data):
 29             try:
 30                 return {'Location': data[api_settings.URL_FIELD_NAME]}
 31             except (TypeError, KeyError):
 32                 return {}
 33
(Pdb) api_settings.URL_FIELD_NAME
'url'
(Pdb) data
{'id': 1, 'file': 'http://testserver/media/excels/mixed_case_bYU8C82.xlsx', 'permissions': {'write': False, 'read': True}}
(Pdb) data[api_settings.URL_FIELD_NAME]
*** KeyError: 'url'
from django.urls import reverse_lazy
from django.views.generic import CreateView
from dry_rest_permissions.generics import DRYPermissions
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    permission_classes = (DRYPermissions,)
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm

    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
def test_service_manager_upload_excel(prepare_service_mgrs):
    client, response = upload_excel("smgr1", "smgr1password")
    assert 403 == response.status_code
    assert 0 == PriceListExcelFile.objects.count()
我的调查

from apps.accounting_users.models import AccountingUser
from apps.marketing_users.models import MarketingUser
from apps.mgmt_users.models import ManagementUser


class PriceListExcelFilePermisionMixin:
    @staticmethod
    def has_read_permission(request):
        return True

    def has_object_read_permission(self, request):
        return True

    @staticmethod
    def has_write_permission(request):
        import pdb;
        pdb.set_trace()
        if request.user.is_anonymous():
            return False
        else:
            return ManagementUser.objects.filter(user=request.user).exists() or \
                   AccountingUser.objects.filter(user=request.user).exists() or \
                   MarketingUser.objects.filter(user=request.user).exists()
from django.urls import reverse_lazy
from django.views.generic import CreateView
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm


    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
> /Users/el/.pyenv/versions/3.6.0/envs/siam-sbrand/lib/python3.6/site-packages/rest_framework/mixins.py(28)get_success_headers()
-> def get_success_headers(self, data):
(Pdb) list
 23             return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
 24
 25         def perform_create(self, serializer):
 26             serializer.save()
 27
 28  ->     def get_success_headers(self, data):
 29             try:
 30                 return {'Location': data[api_settings.URL_FIELD_NAME]}
 31             except (TypeError, KeyError):
 32                 return {}
 33
(Pdb) api_settings.URL_FIELD_NAME
'url'
(Pdb) data
{'id': 1, 'file': 'http://testserver/media/excels/mixed_case_bYU8C82.xlsx', 'permissions': {'write': False, 'read': True}}
(Pdb) data[api_settings.URL_FIELD_NAME]
*** KeyError: 'url'
from django.urls import reverse_lazy
from django.views.generic import CreateView
from dry_rest_permissions.generics import DRYPermissions
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    permission_classes = (DRYPermissions,)
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm

    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
def test_service_manager_upload_excel(prepare_service_mgrs):
    client, response = upload_excel("smgr1", "smgr1password")
    assert 403 == response.status_code
    assert 0 == PriceListExcelFile.objects.count()
Djano REST引发
KeyError
url。然后我可以上传一个文件。
这是一个bug还是我在测试用例中遗漏了什么?

@JensAStrup 你说得对
我忘记了在
views.py中的权限。非常感谢。
希望我的帖子能成为一个例子

视图.py

from apps.accounting_users.models import AccountingUser
from apps.marketing_users.models import MarketingUser
from apps.mgmt_users.models import ManagementUser


class PriceListExcelFilePermisionMixin:
    @staticmethod
    def has_read_permission(request):
        return True

    def has_object_read_permission(self, request):
        return True

    @staticmethod
    def has_write_permission(request):
        import pdb;
        pdb.set_trace()
        if request.user.is_anonymous():
            return False
        else:
            return ManagementUser.objects.filter(user=request.user).exists() or \
                   AccountingUser.objects.filter(user=request.user).exists() or \
                   MarketingUser.objects.filter(user=request.user).exists()
from django.urls import reverse_lazy
from django.views.generic import CreateView
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm


    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
> /Users/el/.pyenv/versions/3.6.0/envs/siam-sbrand/lib/python3.6/site-packages/rest_framework/mixins.py(28)get_success_headers()
-> def get_success_headers(self, data):
(Pdb) list
 23             return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
 24
 25         def perform_create(self, serializer):
 26             serializer.save()
 27
 28  ->     def get_success_headers(self, data):
 29             try:
 30                 return {'Location': data[api_settings.URL_FIELD_NAME]}
 31             except (TypeError, KeyError):
 32                 return {}
 33
(Pdb) api_settings.URL_FIELD_NAME
'url'
(Pdb) data
{'id': 1, 'file': 'http://testserver/media/excels/mixed_case_bYU8C82.xlsx', 'permissions': {'write': False, 'read': True}}
(Pdb) data[api_settings.URL_FIELD_NAME]
*** KeyError: 'url'
from django.urls import reverse_lazy
from django.views.generic import CreateView
from dry_rest_permissions.generics import DRYPermissions
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    permission_classes = (DRYPermissions,)
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm

    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
def test_service_manager_upload_excel(prepare_service_mgrs):
    client, response = upload_excel("smgr1", "smgr1password")
    assert 403 == response.status_code
    assert 0 == PriceListExcelFile.objects.count()
测试.py

from apps.accounting_users.models import AccountingUser
from apps.marketing_users.models import MarketingUser
from apps.mgmt_users.models import ManagementUser


class PriceListExcelFilePermisionMixin:
    @staticmethod
    def has_read_permission(request):
        return True

    def has_object_read_permission(self, request):
        return True

    @staticmethod
    def has_write_permission(request):
        import pdb;
        pdb.set_trace()
        if request.user.is_anonymous():
            return False
        else:
            return ManagementUser.objects.filter(user=request.user).exists() or \
                   AccountingUser.objects.filter(user=request.user).exists() or \
                   MarketingUser.objects.filter(user=request.user).exists()
from django.urls import reverse_lazy
from django.views.generic import CreateView
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm


    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
> /Users/el/.pyenv/versions/3.6.0/envs/siam-sbrand/lib/python3.6/site-packages/rest_framework/mixins.py(28)get_success_headers()
-> def get_success_headers(self, data):
(Pdb) list
 23             return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
 24
 25         def perform_create(self, serializer):
 26             serializer.save()
 27
 28  ->     def get_success_headers(self, data):
 29             try:
 30                 return {'Location': data[api_settings.URL_FIELD_NAME]}
 31             except (TypeError, KeyError):
 32                 return {}
 33
(Pdb) api_settings.URL_FIELD_NAME
'url'
(Pdb) data
{'id': 1, 'file': 'http://testserver/media/excels/mixed_case_bYU8C82.xlsx', 'permissions': {'write': False, 'read': True}}
(Pdb) data[api_settings.URL_FIELD_NAME]
*** KeyError: 'url'
from django.urls import reverse_lazy
from django.views.generic import CreateView
from dry_rest_permissions.generics import DRYPermissions
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    permission_classes = (DRYPermissions,)
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm

    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
def test_service_manager_upload_excel(prepare_service_mgrs):
    client, response = upload_excel("smgr1", "smgr1password")
    assert 403 == response.status_code
    assert 0 == PriceListExcelFile.objects.count()
@詹萨斯特鲁普 你说得对
我忘记了在
views.py中的权限。非常感谢。
希望我的帖子能成为一个例子

视图.py

from apps.accounting_users.models import AccountingUser
from apps.marketing_users.models import MarketingUser
from apps.mgmt_users.models import ManagementUser


class PriceListExcelFilePermisionMixin:
    @staticmethod
    def has_read_permission(request):
        return True

    def has_object_read_permission(self, request):
        return True

    @staticmethod
    def has_write_permission(request):
        import pdb;
        pdb.set_trace()
        if request.user.is_anonymous():
            return False
        else:
            return ManagementUser.objects.filter(user=request.user).exists() or \
                   AccountingUser.objects.filter(user=request.user).exists() or \
                   MarketingUser.objects.filter(user=request.user).exists()
from django.urls import reverse_lazy
from django.views.generic import CreateView
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm


    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
> /Users/el/.pyenv/versions/3.6.0/envs/siam-sbrand/lib/python3.6/site-packages/rest_framework/mixins.py(28)get_success_headers()
-> def get_success_headers(self, data):
(Pdb) list
 23             return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
 24
 25         def perform_create(self, serializer):
 26             serializer.save()
 27
 28  ->     def get_success_headers(self, data):
 29             try:
 30                 return {'Location': data[api_settings.URL_FIELD_NAME]}
 31             except (TypeError, KeyError):
 32                 return {}
 33
(Pdb) api_settings.URL_FIELD_NAME
'url'
(Pdb) data
{'id': 1, 'file': 'http://testserver/media/excels/mixed_case_bYU8C82.xlsx', 'permissions': {'write': False, 'read': True}}
(Pdb) data[api_settings.URL_FIELD_NAME]
*** KeyError: 'url'
from django.urls import reverse_lazy
from django.views.generic import CreateView
from dry_rest_permissions.generics import DRYPermissions
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    permission_classes = (DRYPermissions,)
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm

    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
def test_service_manager_upload_excel(prepare_service_mgrs):
    client, response = upload_excel("smgr1", "smgr1password")
    assert 403 == response.status_code
    assert 0 == PriceListExcelFile.objects.count()
测试.py

from apps.accounting_users.models import AccountingUser
from apps.marketing_users.models import MarketingUser
from apps.mgmt_users.models import ManagementUser


class PriceListExcelFilePermisionMixin:
    @staticmethod
    def has_read_permission(request):
        return True

    def has_object_read_permission(self, request):
        return True

    @staticmethod
    def has_write_permission(request):
        import pdb;
        pdb.set_trace()
        if request.user.is_anonymous():
            return False
        else:
            return ManagementUser.objects.filter(user=request.user).exists() or \
                   AccountingUser.objects.filter(user=request.user).exists() or \
                   MarketingUser.objects.filter(user=request.user).exists()
from django.urls import reverse_lazy
from django.views.generic import CreateView
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm


    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
> /Users/el/.pyenv/versions/3.6.0/envs/siam-sbrand/lib/python3.6/site-packages/rest_framework/mixins.py(28)get_success_headers()
-> def get_success_headers(self, data):
(Pdb) list
 23             return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
 24
 25         def perform_create(self, serializer):
 26             serializer.save()
 27
 28  ->     def get_success_headers(self, data):
 29             try:
 30                 return {'Location': data[api_settings.URL_FIELD_NAME]}
 31             except (TypeError, KeyError):
 32                 return {}
 33
(Pdb) api_settings.URL_FIELD_NAME
'url'
(Pdb) data
{'id': 1, 'file': 'http://testserver/media/excels/mixed_case_bYU8C82.xlsx', 'permissions': {'write': False, 'read': True}}
(Pdb) data[api_settings.URL_FIELD_NAME]
*** KeyError: 'url'
from django.urls import reverse_lazy
from django.views.generic import CreateView
from dry_rest_permissions.generics import DRYPermissions
from rest_framework import generics

from apps.price_list_excel_files.forms import UploadFileForm
from apps.price_list_excel_files.models import PriceListExcelFile
from apps.price_list_excel_files.serializers import PriceListExcelFileSerializer


class PriceListExcelFileList(generics.ListCreateAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListExcelFileDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (DRYPermissions,)
    queryset = PriceListExcelFile.objects.all()
    serializer_class = PriceListExcelFileSerializer


class PriceListUploadExcel(CreateView):
    permission_classes = (DRYPermissions,)
    template_name = 'price_list_excel_files/upload.html'
    form_class = UploadFileForm

    def get_form_kwargs(self):
        """
        This view has no PUT because user always upload new file
        :return:
        """
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

    def get_success_url(self):
        return reverse_lazy('api:price_list_excel_files:list')
def test_service_manager_upload_excel(prepare_service_mgrs):
    client, response = upload_excel("smgr1", "smgr1password")
    assert 403 == response.status_code
    assert 0 == PriceListExcelFile.objects.count()

您可以共享Rest框架视图吗?前提是我们知道您运行测试的对象。@JensAstrup OK。一个moment@JensAstrup给您。@AllѕVааіy我正在对我系统中的未经授权用户运行测试。您可以共享Rest框架视图吗?前提是我们知道您运行测试的对象。@JensAstrup OK。一个moment@JensAstrup给你。@AllѕVааіy我正在对系统中未经许可的用户运行测试