Включение CSRF для Django

У меня есть следующий код python в моем Django views.py, код принимает тело JSON и отправляет извлеченные ДАННЫЕ в другую конечную точку API, я упростил код здесь.

Как включить csrf так, чтобы он отправлял токен обратно вызывающей стороне для этого метода? Я вызываю его из postman.

@csrf_protect
def validate_booking(request):
  if request.method != "POST":
    return HttpResponseServerError("Invalid HTTP method")
  body = json.loads(request.body)
  booking_details = body["booking_details"]

    DATA = {
      "name": booking_details["name"],
      "nric": booking_details["nric"],
      "booking_id": booking_details["booking_id"]
    }

  return HttpResponse(status="200")

На этом сайте указано, что нужно вставить этот кусок кода в мой метод. Но что такое "a_template.html"? https://docs.djangoproject.com/en/4.1/ref/csrf/

@csrf_protect
def my_view(request):
    c = {}
    # ...
    return render(request, "a_template.html", c)

Это нелегко сделать, поскольку CSRF состоит из двух шагов

  1. Есть значение, которое передается клиенту и сохраняется в сессии на сервере.
  2. При получении POST запроса клиент отправляет это значение как csrfmiddlewaretoken в теле, а сервер сверяет его с сохраненным значением в сессии сервера.

Так что это невозможно сделать в API, поскольку требуется управление сессиями, чего нет в реализациях REST API.

Спасибо за ваш ответ. Мне удалось найти решение, выполнив следующие действия:

  1. Создайте новый метод GET, который будет генерировать CSRF-токен сессии, используя python
  2. .
  3. Вместо использования render, который ожидает файл шаблона HTML, я использовал JsonResponse(data) для возврата в формате JSON напрямую
  4. .
  5. В моем приложении postman, в котором я делаю POST запрос с X-CSRFToken в заголовке, я сначала сделаю GET запрос к новому методу, который я создал в шаге 1, чтобы получить токен и сохранить его как переменную окружения
  6. .

Ниже приведен пример метода GET:

from django.http import JsonResponse

def get_csrf_token(request):
    csrf_token = csrf(request)['csrf_token']
    data = {'csrf_token': csrf_token}
    return JsonResponse(data)
Вернуться на верх