Ich versuche, eine Datei mithilfe der Axios-Post-Anfrage in einer React-App auf einen Django-Server hochzuladen. Der Server erwartet ein CSRF-Cookie im Anforderungsheader.
Diese Anfrage enthält bereits alle Methoden, die ich zum Setzen von Cookies finden kann. Über document.cookie
,设置withCredential: true
,并指定Cookie
Header.
Das ist meine Axios-Anfrage:
const onSubmit = async (data) => { const formData = new FormData() formData.append('file', data.file[0]) const csrftoken = getCookie('csrftoken'); document.cookie = `csrftoken=${csrftoken}` const res = await axiosInstance.post('/upload/', formData, { timeout: 0, headers: { 'Cookie': `csrftoken=${csrftoken}`, 'Content-Type': 'multipart/form-data', 'x-csrftoken': csrftoken, }, withCredentials: true, }) console.log(res) }
Das ist meine Django-Ansicht:
def upload_file(request): form = UploadFileForm() if request.method == 'POST': form = UploadFileForm(request.POST, request.FILES) if form.is_valid(): file_id = save_file_to_database(request.FILES['file']) response = JsonResponse({'id': file_id}, status=201) return response else: response = HttpResponse({'message': 'Upload failed'}, status=400) return response return render(request, 'upload.html', {'form': form})
Außerdem glaube ich, dass ich die relevanten Django-Einstellungen korrekt eingerichtet habe in settings.py
:
CORS_ORIGIN_WHITELIST = ( "http://localhost:8000", "http://127.0.0.1:5173", ) CSRF_TRUSTED_ORIGINS = [ "http://127.0.0.1:5173" ] SESSION_COOKIE_SAMESITE = 'None'
Wie kann sichergestellt werden, dass CSRF-Cookies in Anforderungsheadern enthalten sind oder anderweitig die CSRF-Anforderungen erfüllen? Natürlich funktioniert die Route, wenn wir @csrf_exempt
zur Ansicht hinzufügen, es sollte also eigentlich ein CSRF-Problem sein.
您只需将令牌包含在
formData
中。无需标头或 cookie 操作:提示:每当您不确定是否正在发送 cookie、标头等时,请检查浏览器开发工具中的网络选项卡。如果您在请求的“请求标头”部分看到它们,那么它们正在被发送,这意味着问题出在服务器端。在本例中,对于
multipart/form-data
Django 需要csrfmiddlewaretoken
表单字段中的令牌。对于application/json
请求,您可以使用X-CSRFToken
标头。