Включение 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 состоит из двух шагов
- Есть значение, которое передается клиенту и сохраняется в сессии на сервере.
- При получении POST запроса клиент отправляет это значение как
csrfmiddlewaretoken
в теле, а сервер сверяет его с сохраненным значением в сессии сервера.
Так что это невозможно сделать в API, поскольку требуется управление сессиями, чего нет в реализациях REST API.
Спасибо за ваш ответ. Мне удалось найти решение, выполнив следующие действия:
- Создайте новый метод GET, который будет генерировать CSRF-токен сессии, используя python .
- Вместо использования render, который ожидает файл шаблона HTML, я использовал JsonResponse(data) для возврата в формате JSON напрямую .
- В моем приложении postman, в котором я делаю POST запрос с X-CSRFToken в заголовке, я сначала сделаю GET запрос к новому методу, который я создал в шаге 1, чтобы получить токен и сохранить его как переменную окружения .
Ниже приведен пример метода 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)