Django在发送POST请求时返回403错误
我在用下面的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 个回答
这个回应是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);
}
});
你可以看看这里 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)。然后,在你的脚本中传递这个令牌,就可以了。
你发帖的这个页面上有Django表单吗?如果有的话,我在想是不是出现了csrf错误。这种错误通常会显示为403。如果是这样的话,你需要加上{{ csrf_token }}这个标记。这只是我的一个想法。