当我使用以下Python代码向我的Django网站发送POST请求时,我收到403:Forbidden错误。
url = 'http://www.sub.domain.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
当我打开任何其他网站时,它正常工作。 domain.com也是Django网站,也可以正常使用。 我想,这是Django配置问题,任何人都可以告诉我应该怎样做才能提供对我脚本的访问权限?
答案 0 :(得分:45)
看这里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)。然后,在您的脚本中传递此令牌,就是这样。
答案 1 :(得分:27)
您发布的视图是否包含Django表单?如果是这样,我想知道它是否给出了csrf错误。我认为这表现为403.在这种情况下,您需要添加{{csrf_token}}标记。只是一个想法。
答案 2 :(得分: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);
}
});
答案 3 :(得分:0)
或者您可以允许此帖子请求获得许可。
注意:如果您不需要对用户进行身份验证以便在我们的服务器上发布任何内容(例如,新用户首次注册时),则应使用此选项。
from rest_framework.permissions import AllowAny
class CreateUser(APIView):
permission_classes = (AllowAny,)
def post(self, request, format=None):
return(Response("hi"))
进一步注意,如果要将该发布请求形成为不同的域(如果应用程序的前端处于React或角度且后端位于Django中),请确保在设置文件中添加以下内容:
更新INSTALLED_APPS以使用' coreHeaders' :
INSTALLED_APPS = [
' corsheaders&#39 ;,
] 强>
通过再次向设置文件添加以下内容,白名单列出您的前端域名:
CORS_ORIGIN_WHITELIST =( '本地主机:8080&#39 ;, )强>
答案 4 :(得分:0)
Django文档提供了几种确保包含CSRF令牌的方法。有关详细信息,请参阅https://docs.djangoproject.com/en/1.11/ref/csrf/。
答案 5 :(得分:0)
当身份验证令牌过期或没有与请求一起发送令牌时,我收到此错误。使用更新的令牌修复了问题。
curl -X POST -H "Authorization: Token mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/
或
curl -X POST -H "Authorization: JWT mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/
取决于令牌类型。
答案 6 :(得分:0)
我也遇到了这个问题,因为我试图使用'../url'
URL Jumping从另一个端点访问Main端点。
我的解决方案是为同一视图集添加另一个路径;
router.register('main/url',ViewSet,'name');
router.register('secondary/url',ViewSet,'name')
但是,在您的情况下,您正尝试从Django的角度从完全不同的位置访问它,因此您需要使用@crsf_exempt
中间件标记您的ViewSet,该中间件将禁用与CRSF相关的安全协议。