原因

我这边定义了一个表单,向后台提交数据,提交方式为 POST,程序出现以下问题:

出现原因

出现这个报错的原因主要是跨站请求伪造。Django 框架为我们提供了一个中间件,用于处理跨站请求伪造,假如某个用户从来没有登录过我们的网站就给我们网站 post 数据,这样是会被 Django 这个中间件给阻挡,禁止请求。然后我们在开发 web 的时候可以给每一个登录的用户分配一个 token。这个 token 会被写入到用户的 cookie 文件里面。然后下次用户 post 数据的时候,就会带上这个 token。 因此如果没有 token 的用户就会被禁止 post 数据。

解决

改 settings 文件

注释掉 settings 文件里关于 CSRF 的验证。

settings.py
1
2
3
4
5
6
7
8
9
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', # POST 403
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

改 views 文件

或者可以在你的 views 文件内,导入模块 from django.views.decorators.csrf import csrf_exempt,并在接收 POST 请求数据的函数前面添加修饰器 @csrf_exempt

以上两个方法都可以让当前的 POST 不受 Django 跨站请求伪造的中间件的限制。