csrf_exempt装饰器在基于Dajngo函数的视图中不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csrf_exempt装饰器在基于Dajngo函数的视图中不起作用相关的知识,希望对你有一定的参考价值。

我正在将React与Django一起使用,大多数客户端与服务器之间的交互是通过使用Django Rest Framework通过API完成的。我创建了一个名为mail的标准应用程序,它具有一个标准视图,该视图接受带有POSTcsrf_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") 

反应成分

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端点上使用。

答案

我收到此错误是因为我的app_name和用于访问url本身的app相同。因此,我的app_namenordalmail,而我的url也是Nordalmail。

以上是关于csrf_exempt装饰器在基于Dajngo函数的视图中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

装饰器在调用它装饰的函数之前运行?

如何在基类的函数上使用装饰器并在继承基类时让装饰器在该函数上工作

python装饰器在接口自动化测试中的应用

简单理解装饰器在Python里面的作用

叠加装饰器迭代器

一文带你了解 Python 中的装饰器