Почему просматриваемый API DRF выполняет проверки разрешений для нескольких типов запросов для каждого фактического запроса? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть простое представление списка DRF и я хотел написать некоторые разрешения, относящиеся к POST запросам.Это привело к ошибке при выдаче GET запросов.Это привело меня к пониманию того, что мой класс разрешений вызывается несколько раз по запросам, которые не были отправлены.Вот мои файлы.

permissons.py:

class IsDummy(permissions.BasePermission):
    def has_permission(self, request, view):
        print("\n{}\n".format(request.method)) 
        if request.method in permissions.SAFE_METHODS:
            return True
        return False

views.py:

class UserListView(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [IsDummy]

Проблема возникает только тогда, когда я отправляю запрос из своего браузера на доступный API-интерфейс.Когда я отправляю запрос GET по URL-адресу списка, я получаю следующее, напечатанное на терминале из оператора печати в классе разрешений IsDummy:

GET

POST

POST

OPTIONS

Когда я отправляю GET или OPTIONSзапрос через почтальона. Я вижу единственный подходящий метод запроса, который я на самом деле использовал.

Кажется, что первый из перечисленных методов - это всегда фактический метод, который я использовал, я понятия не имею, где дополнительные POSTOPTION приходят из.Еще более странная часть заключается в том, что после всего этого страница будет нормально загружаться, даже если запросы POST явно приведут к IsDummy.has_permission, возвращающему False.

Инструменты разработчика Chrome показывают только одинGET запрос отправлен, и, поскольку он только кажется, что он просматривается в API для просмотра, я уверен, что это как-то связано с этим, но я не могу понять, что я испортил, чтобы это произошло.

1 Ответ

0 голосов
/ 10 октября 2018

Браузер API - это одна страница, которая может добавлять \ обновлять \ удалять экземпляры.Когда вы запрашиваете эту страницу, DRF проверит все необходимые разрешения, чтобы увидеть, разрешено ли отображение соответствующего модуля.

Глубоко в исходном коде DRF вы можете увидеть это в renderers.py:

class BrowsableAPIRenderer(BaseRenderer):
    """
    HTML renderer used to self-document the API.
    """
    media_type = 'text/html'
    format = 'api'
    template = 'rest_framework/api.html'
    filter_template = 'rest_framework/filters/base.html'
    code_style = 'emacs'
    charset = 'utf-8'
    form_renderer_class = HTMLFormRenderer

    ...

    def get_context(self, data, accepted_media_type, renderer_context):
         ....
         context = {
             ....
            'put_form': self.get_rendered_html_form(data, view, 'PUT', request),
            'post_form': self.get_rendered_html_form(data, view, 'POST', request),
            'delete_form': self.get_rendered_html_form(data, view, 'DELETE', request),
            'options_form': self.get_rendered_html_form(data, view, 'OPTIONS', request),
         }
         return context

    def get_rendered_html_form(self, data, view, method, request):
        ....
        if not self.show_form_for_method(view, method, request, instance):
            ....

    def show_form_for_method(self, view, method, request, obj):
        """
        Returns True if a form should be shown for this method.
        """
        if method not in view.allowed_methods:
            return  # Not a valid method

        try:
            view.check_permissions(request)
            if obj is not None:
                view.check_object_permissions(request, obj)
        except exceptions.APIException:
            return False  # Doesn't have permissions
        return True

view.check_permissions(request) в show_form_for_method - поэтому API-интерфейс с возможностью просмотра DRF выполняет проверки разрешений для нескольких типов запросов для каждого фактического запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...