Complete worked example
python
from bootstrap_lab import django_setup
django_setup(__name__)
from django.http import JsonResponse
from django.middleware.csrf import get_token
from django.test import Client
from django.urls import path
from django.views.decorators.http import require_http_methods
@require_http_methods(["GET", "POST"])
def form_view(request):
if request.method == "GET":
return JsonResponse({"token": get_token(request)})
return JsonResponse({"saved": True}, status=201)
urlpatterns = [path("form/", form_view)]
def csrf_request(mode):
client = Client(enforce_csrf_checks=True)
token = client.get("/form/").json()["token"]
headers = {}
if mode == "correct":
headers["HTTP_X_CSRFTOKEN"] = token
elif mode == "wrong":
headers["HTTP_X_CSRFTOKEN"] = "invalid-token"
return client.post("/form/", data={"title": "Owned fixture"}, **headers).status_code- Reasoning
- The initial GET asks get_token for a token and lets the middleware set the corresponding cookie. The later POST supplies that token in the expected header.