Django API Post 403 FORBIDDEN

1. 测试Django编写的POST方法的API,报出下面的错误:

``` Forbidden (403) CSRF verification failed. Request aborted. You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties. If you have configured your browser to disable cookies, please re-enable them, at least for this site, or for 'same-origin' requests. ```

2. ROOT CAUSE

Django提供了CSRF的防护。CSRF是跨站点请求伪造,简单来说就是用户在访问受信任网站后,浏览器记录了受信任网站的cookie,此时用户在不登出受信任网站的同时访问了危险网站,危险网站的请求和cookie一起到达服务器,服务器Session未过期的时候,就误认为该请求是用户发出的,从而被危险网站利用。在建立Django项目的时候,setting.py中就会有 ``` MIDDLEWARE = [ .... 'django.middleware.csrf.CsrfViewMiddleware', .... ] ```

3. solution

1. 如果是表单,可以在模版文件中加入` {% csrf_token %} `,而且模版的函数使用`reander`。 2. 如果是API也就没有模版,此时无法添加` {% csrf_token %} `,最后找到方法可以使用 `django.views.decorators.csrf` 的 `csrf_exempt`函数对POST的API函数进行修饰。可以使其避免CSRF安全检查机制。 例:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def add_event(request):

看网上又说将'django.middleware.csrf.CsrfViewMiddleware'注释掉,最好还是不要如此做,保持django默认安全机制,保持其安全特性。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在Django中发送POST请求时遇到"forbidden"(禁止访问)错误时,通常是由于CSRF保护机制导致的。 Django默认启用了CSRF(Cross-Site Request Forgery)保护,这是一种用于防止跨站点请求伪造的安全机制。当你在发送POST请求时,需要在请求中包含CSRF令牌。否则,Django会拒绝该请求并返回"forbidden"错误。 你可以尝试以下方法来解决这个问题: 1. 在发送POST请求之前,确保你的页面上包含了CSRF令牌。可以通过在表单中添加`{% csrf_token %}`标签来实现。 2. 在发送POST请求时,确保你的请求中包含了CSRF令牌。可以通过在请求的数据中添加`csrfmiddlewaretoken`参数,并将其值设置为CSRF令牌的值。 ```python import requests # 获取CSRF令牌 def get_csrf_token(): import re import requests response = requests.get('http://your-domain.com') match = re.search(r'csrfmiddlewaretoken\' value=\'(.+?)\'', response.text) if match: return match.group(1) return '' # 构造POST请求 url = 'http://your-domain.com/post-endpoint' csrf_token = get_csrf_token() data = { 'param1': 'value1', 'param2': 'value2', 'csrfmiddlewaretoken': csrf_token } response = requests.post(url, data=data) ``` 3. 如果你正在使用Ajax来发送POST请求,可以将CSRF令牌添加到请求的头部。 ```javascript $.ajaxSetup({ beforeSend: function(xhr, settings) { 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 = jQuery.trim(cookies[i]); if (cookie.substring(0, name.length + 1) === (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { // Only send the token to relative URLs i.e. locally. xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); } } }); ``` 请注意,以上方法中的代码示例是一种通用的做法,具体实现方式可能因你的Django版本和项目配置而有所不同。你可以根据实际情况进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值