Django在发送POST请求时返回403错误

53 投票
7 回答
98003 浏览
提问于 2025-04-16 22:08

我在用下面的Python代码向我的Django网站发送POST请求时,遇到了403: Forbidden错误。

url = 'http://www.sub.example.com/'
values = { 'var': 'test' }

try:
    data = urllib.urlencode(values, doseq=True)
    req = urllib2.Request(url, data)
    response = urllib2.urlopen(req)
    the_page = response.read()
except:
    the_page = sys.exc_info()
    raise

当我打开其他网站时,一切正常。example.com也是Django网站,也能正常工作。我觉得这可能是Django的配置问题,有人能告诉我该怎么做才能让我的脚本有权限访问吗?

7 个回答

3

这个回应是403,因为Django要求每次你发送POST请求时,都必须包含一个csrf令牌(这个令牌要放在发送的数据里)。

有几种方法可以做到这一点,比如:

从cookie中获取这个令牌,具体方法可以在某篇文章中找到。

或者

你可以通过模板中的{{ csrf_token }}从DOM中获取它。

现在我们来看看第二种方法:

var post_data = {
  ...
  'csrfmiddlewaretoken':"{{ csrf_token }}"
  ...
}

$.ajax({
  url:'url',
  type:'POST'
  data:post_data,
  success:function(data){
    console.log(data);
  },
  error:function(error){
    console.log(error);
  }
});
52

你可以看看这里 https://docs.djangoproject.com/en/dev/ref/csrf/#how-to-use-it

试着在你的视图上加上 @csrf_exempt。这样,Django的CSRF中间件就会忽略CSRF保护。你还需要使用 from django.views.decorators.csrf import csrf_exempt。详细信息可以查看这里: https://docs.djangoproject.com/en/dev/ref/csrf/#utilities

请注意,禁用视图的CSRF保护会让你的应用更容易受到CSRF攻击。

如果安全对你很重要,可以考虑先使用 @csrf_exempt,然后再加上 @requires_csrf_token(详情见: https://docs.djangoproject.com/en/dev/ref/csrf/#unprotected-view-needs-the-csrf-token)。然后,在你的脚本中传递这个令牌,就可以了。

36

你发帖的这个页面上有Django表单吗?如果有的话,我在想是不是出现了csrf错误。这种错误通常会显示为403。如果是这样的话,你需要加上{{ csrf_token }}这个标记。这只是我的一个想法。

撰写回答