Django测试HTML表单实现登录过程中遇到错误提示:Forbidden (CSRF cookie not set.):

错误提示如下:

 提示的大概意思是说:没有设置CSRF cookie

1 什么是CSRF ?

CSRF(Cross-site request forgery)跨站请求伪造

· 功能:

        防止跨站请求伪造的功能

· 原理:

        客户端访问服务器端,在服务器端正常返回给客户端数据的时候,而外返回给客户端一段字符串,等到客户端下次访问服务器端时,服务器端会到客户端查找先前返回的字符串,如果找到则继续,找不到就拒绝。

· 访问流程:

        客户端 --> URL路由系统 --> CSRF --> 视图函数。

2 解决办法

        我这里要写的是一个内部使用的api接口,也不大会有 跨站请求伪造,所以这里提供两个不是很推荐,但是非常简单的方式解决这个问题,既然不需要 CSRF,我们就把CSRF检测关掉即可。

· 方法一

a. 在创建的项目中,找到settings.py配置文件

b. 在settings.py中找到 MIDDLEWARE参数,将其中的'django.middleware.csrf.CsrfViewMiddleware' 注释掉即可,如下图所示:

 

· 方法二

原理和方法一差不多,上面注释掉的django.middleware.csrf.CsrfViewMiddleware,是一个全局的设置,我们也可以对单个api 进行特别设置,这里我们使用 @csrf_exempt ,它可以取消当前函数防跨站请求伪造功能。

a. 找到当前应用的 views.py 文件;

b. 这里我们用 @csrf_exempt 处理api需要导包,from django.views.decorators.csrf import csrf_exempt ;

c. 我们在对应的视图函数上加上@csrf_exempt ,如下图所示:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这个错误是由于DjangoCSRF保护机制引起的,它需要确保每个POST请求都具有与会话关联的CSRF令牌。 在Django,每个POST请求都需要在请求包含一个名为`csrfmiddlewaretoken`的CSRF令牌。如果请求不包含这个令牌,Django会抛出`Forbidden (CSRF cookie not set.)`错误。 为了解决这个问题,您需要在POST请求的表单包含CSRF令牌。例如,在您的HTML表单,可以添加以下代码: ```html {% csrf_token %} ``` 这将在表单添加一个隐藏字段,其包含与当前会话关联的CSRF令牌。当用户提交表单时,这个令牌将与请求一起发送,以通过CSRF保护。 如果您使用的是AJAX请求,可以将CSRF令牌作为请求头发送。例如,在JavaScript,可以添加以下代码: ```javascript function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie !== '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i].trim(); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } var csrfToken = getCookie('csrftoken'); $.ajax({ ... headers: { 'X-CSRFToken': csrfToken }, ... }); ``` 这将在请求头添加一个名为`X-CSRFToken`的头,其包含与当前会话关联的CSRF令牌。这样,您的AJAX请求将通过CSRF保护。 请注意,如果您使用的是第三方库或框架,例如Django REST framework或jQuery,它们可能会自动处理CSRF令牌。在这种情况下,您不需要手动添加CSRF令牌。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值