Я переписываю бэкэнд внутреннего веб-сайта с PHP на Django (используя REST Framework).
Обе версии (PHP и Django) должны быть развернуты одновременно на некоторое время, и у нас есть набор программных инструментов, которые взаимодействуют с унаследованным веб-сайтом через простой AJAX API. Все запросы выполняются методом GET.
Мой подход к выполнению запросов на обоих сайтах заключался в создании простого приложения-адаптера с маршрутизацией на «http://<site-name>/ajax.php
» для имитации вызова к контроллеру Ajax. Упомянутое приложение содержит одно простое представление на основе функций, которое извлекает данные из входящего запроса, чтобы определить, какое соответствующее представление Django вызывать при входящем запросе (в основном то, что контроллер Ajax делает в версии PHP).
Это работает, но я столкнулся с проблемой. Одним из моих действий API было простое создание записи в таблице БД. Итак, я определил свой DRF viewset, используя некоторые общие миксины:
class MyViewSet(MyGenericViewSet, CreateModelMixin):
# ...
Это добавляет действие create
, направленное на POST
запросы на странице. Именно то, что мне нужно. За исключением того, что мои входящие запросы используют метод GET
... Я мог бы написать свое собственное действие create
и заставить его принимать GET
запросы, но в долгосрочной перспективе наши инструменты адаптируются к Django API, и приложение-адаптер будет больше не нужны, поэтому я предпочел бы иметь "чистые" наборы и модели вида. Для такого действия имеет смысл использовать POST
.
В моем приложении-адаптере я наивно пытался это сделать:
request.method = "POST"
request.POST = request.GET
Перед передачей запроса в create
представление. Как и ожидалось, это не сработало, и я получил сообщение об ошибке аутентификации CSRF, хотя в моем представлении приложения адаптера есть @csrf_exempt
декоратор ...
Я знаю, что я мог бы попытаться поместить треугольник в квадраты здесь, но есть ли способ сделать это без переписывания моего собственного действия create
?