Действие иногда отсутствует в рамках REST Django - PullRequest
0 голосов
/ 09 сентября 2018

Я написал настраиваемый класс разрешений в Django REST Framework версии 3.8.2, который ведет себя по-разному в зависимости от действия запроса. Я обнаружил, что иногда view.action равен None при использовании Browsable API для отладки. Ниже приведен фрагмент кода, который вызывает исключение при использовании с Browsable API.

class AdminOnlyPermission(BasePermission):

    def has_permission(self, request, view):

        # Just to demonstrate that view.action can be None
        assert(view.action is not None)

        # Only allow admin to delete
        if view.action == 'delete' and not request.user.is_staff:
            return False

        return True

Что означает, что view.action - это None? Могу ли я безопасно проигнорировать его или возможно, чтобы злонамеренный пользователь сделал запрос на удаление с действием, установленным на None?

Edit:

Класс прав доступа используется только для GenericViewSets.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Я прошел через аналогичную проблему с остальными рамками и разрешениями. И оказывается, что эти действия вызваны, когда html-формы rest-framework отправляют на сервер запросы GET и OPTIONS.

... elif view.action is None and request.method in SAFE_METHODS: return True

Пришлось исправить, как показано выше. Но я не думаю, что это будет дело в производстве.

0 голосов
/ 09 сентября 2018

Действия набора не могут быть None. Если во время вызова представлений в некоторой степени он стал None, класс набора повысит значение TypeError.

Согласно исходному коду DRF ,

@classonlymethod
def as_view(cls, actions=None, **initkwargs):
    cls.suffix = None
    cls.detail = None
    cls.basename = None

    # actions must not be empty
    if not actions:
        raise TypeError("The `actions` argument must be provided when "
                        "calling `.as_view()` on a ViewSet. For example "
                        "`.as_view({'get': 'list'})`")


Метод .as_view() будет вызываться URL Dispatcher всякий раз, когда в вашем списке urlpatterns найден соответствующий шаблон регулярного выражения

Могу ли я проигнорировать это?

Да, , но Это полностью зависит от того, как вы определили свой класс представления. Это означает, что если у вас есть пользовательское действие / метод, который принимает метод GET и удаляет экземпляр вашей модели, этот класс разрешений может вам не помочь.
Это может быть полезно, если вы дополнительно настроите класс AdminOnlyPermission.


Вы можете использовать request.method=='DELETE' вместо action == 'delete', что почти равнозначно

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