Die Axios-Anfrage sendet den erwarteten Cookie-Header nicht an den Django-Server
P粉285587590
P粉285587590 2024-03-28 11:18:33
0
1
301

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.

P粉285587590
P粉285587590

Antworte allen(1)
P粉463824410

您只需将令牌包含在 formData 中。无需标头或 cookie 操作:

const onSubmit = async (data) => {
    const formData = new FormData()
    formData.append('file', data.file[0])
    formData.append('csrfmiddlewaretoken', getCookie('csrftoken'));

    const res = await axiosInstance.post('/upload/', formData, {
        timeout: 0,
        headers: {
            'Content-Type': 'multipart/form-data',
        },
        withCredentials: true,
    })

    console.log(res)
}

提示:每当您不确定是否正在发送 cookie、标头等时,请检查浏览器开发工具中的网络选项卡。如果您在请求的“请求标头”部分看到它们,那么它们正在被发送,这意味着问题出在服务器端。在本例中,对于 multipart/form-data Django 需要 csrfmiddlewaretoken 表单字段中的令牌。对于 application/json 请求,您可以使用 X-CSRFToken 标头。

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!