csrf_exempt Декоратор не работает в Django функциональных представлениях - PullRequest
1 голос
/ 06 марта 2020

Я использую React с Django, большая часть взаимодействия клиент-сервер выполняется через API с использованием Django Rest Framework. Я создал стандартное приложение под названием mail, оно имеет стандартное представление, которое принимает запрос POST с декораторами csrf_exempt и login_required. Однако всякий раз, когда я совершаю ajax вызов через Axios, он всегда дает мне 403 Invalid CSRF Token error - CSRF Cookie not specified.

views.py

from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt

@login_required
@csrf_exempt
def testmail(request):
    if request.method=="POST":
        EmailQueue.objects.create(subject='TEST EMAIL BROTHER', body=render_to_string('nordalmail/testmail.html'), to_email=request.user.email, from_email=settings.FROM_EMAIL, send_now=True)
        return HttpResponse("CHECK ADMIN")
    if request.method == "GET":
        return render(request, "nordalmail/test-mail.html") 

React Component

import axios from 'axios';                                                                                                                                                                                                                    
import {createMessage, returnErrors} from './messages.js';
import {tokenConfig} from './auth.js';

// Tokenconfig simply gets the Authorization Token and sends it as a Header value 

export const sendTestMail = () => (loggedUserEmail, getState) => {
    axios
        .post('http://alice:55403/nordalmail/', tokenConfig(getState))
        .then(res => {
            createMessage("A test email has been sent to your registered email address!",
            "Email Sent");
        })  
        .catch(err => {
            returnErrors("Something went wrong while sending your email, website administrator has been notified of this incidence!", "Error");
        }); 
}

Вот запрос, который я отправляю

Request URL: http://alice:55403/nordalmail/
Request Method: POST
Status Code: 403 Forbidden
Remote Address: 127.0.0.1:55403
Referrer Policy: no-referrer-when-downgrade
headers: {"headers":{"Content-Type":"application/json","Authorization":"Token 35a7aa30b26ebb1c269c6cca0cd323c07e028171aa268b61d0dfc41871f93de6"}}

Я использую brave browser, поэтому я не знаю, как получить raw headers. Я могу ручаться за достоверность этого Authorization Token, так как он работает на других правильных конечных пользователях API.

1 Ответ

0 голосов
/ 11 марта 2020

Я получил эту ошибку из-за того, что мои app_name и url, которые используются для доступа к самому app, одинаковы. Таким образом, мой app_name равен nordalmail, а мой url для доступа к приложению также является nordalmail.

Теперь вот реальная проблема, я установил root моего сайта в качестве фактической панели администратора, предоставляемой самой Django. Поэтому, когда я сделал запрос к /nordalmail, он фактически отобразил списки моделей в приложении. Все, что мне нужно было сделать, это изменить URL, и это сработало.

...