Как заставить Django 2.1 принимать запросы PATCH / DELETE - PullRequest
0 голосов
/ 04 марта 2019

Я создаю приложение с помощью Django 2.1, и я хочу иметь возможность выполнять запросы PATCH / DELETE через ajax-вызовы.Изучив этот вопрос, я обнаружил, что решение состоит в том, чтобы обмануть браузер с помощью запроса POST, но установив заголовок X_METHODOVERRIDE на нужный метод.

Я бы начал делать это, создав промежуточное программное обеспечение, которое позаботитсяэтого.Как лучше всего это сделать?

Обратите внимание, что пока я не хочу использовать код Django-REST

для выполнения запроса DELETE:

view.py

class CategoryManageView(StaffRequiredMixin, View):
    model = Category
    response_dict = {'status': False, 'text': '', 'data': {}}

    def delete(self, request, *args, **kwargs):
        cat = get_object_or_404(Category, request.POST['id'])
        self.response_dict['data'] = cat
        cat.delete()
        self.response_dict['status'] = True
        self.response_dict['text'] = 'Category deleted successfuly'
        return JsonResponse(self.response_dict)

Если метод вызова ajax установлен на УДАЛИТЬ вместо POST или GET, я получаю сообщение об ошибке в консоли:

УДАЛИТЬ http://127.0.0.1:8000/dashboard/admin/categories/manage 403 (Запрещено)

1 Ответ

0 голосов
/ 04 марта 2019

Код ошибки 403 указывает, что это происходит из-за защиты CSRF.Как показывает документация CSRF , PUT и DELETE - а также POST - считаются "небезопасными" методами, и поэтому Django запрещает запросы, если у них нет действительного токена CSRF.

На этой же странице есть документация о том, как включить токен в ваших Ajax-запросах.В качестве альтернативы - хотя это настоятельно не рекомендуется - вы можете использовать декоратор @csrf_exempt в представлении, чтобы отключить защиту.

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