csrf_exempt 装饰器在基于 Django 函数的视图中不起作用
csrf_exempt Decorator does not work in Dajngo function based views
我将 React 与 Django 一起使用,大部分客户端服务器交互是通过 API 使用 Django Rest Framework 完成的。我创建了一个名为 mail
的标准应用程序,它有一个标准视图,它接受带有 csrf_exempt
和 login_required
装饰器的 POST
请求。但是,每当通过 Axios
进行 ajax
调用时,它总是给我一个 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
和用于访问 app
本身的 url
相同。所以我的 app_name
是 nordalmail
而我的 url
访问应用程序也是 nordalmail。
现在真正的问题来了,我已经将我网站的 root
设置为 Django
本身提供的实际管理面板。因此,当我向 /nordalmail
发出请求时,它实际上在应用程序中呈现了模型列表。我所要做的就是更改 URL 并且它起作用了。
我开始了一个项目,需要接受 POST 从外部应用程序到 django,不知何故,我在项目 urls path('', admin.site.urls, name='admin')
中写了以下行 path('', admin.site.urls, name='admin')
我没有马上意识到,但是这条路导致@csrf_exempt 在我的 function-based 视图中被忽略。
我将 React 与 Django 一起使用,大部分客户端服务器交互是通过 API 使用 Django Rest Framework 完成的。我创建了一个名为 mail
的标准应用程序,它有一个标准视图,它接受带有 csrf_exempt
和 login_required
装饰器的 POST
请求。但是,每当通过 Axios
进行 ajax
调用时,它总是给我一个 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
和用于访问 app
本身的 url
相同。所以我的 app_name
是 nordalmail
而我的 url
访问应用程序也是 nordalmail。
现在真正的问题来了,我已经将我网站的 root
设置为 Django
本身提供的实际管理面板。因此,当我向 /nordalmail
发出请求时,它实际上在应用程序中呈现了模型列表。我所要做的就是更改 URL 并且它起作用了。
我开始了一个项目,需要接受 POST 从外部应用程序到 django,不知何故,我在项目 urls path('', admin.site.urls, name='admin')
中写了以下行 path('', admin.site.urls, name='admin')
我没有马上意识到,但是这条路导致@csrf_exempt 在我的 function-based 视图中被忽略。