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

问题描述 投票:33回答:6

当我使用以下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配置问题,任何人都可以告诉我应该怎么做才能提供对我脚本的访问权限?

python django http-status-code-403 http-post
6个回答
27
投票

您要发布的视图是否包含Django表单?如果是这样,我想知道它是否给出了csrf错误。我认为这表现为403.在这种情况下,您需要添加{{csrf_token}}标记。只是一个想法。


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)。然后,在您的脚本中传递此令牌,就是这样。


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);
  }
});

0
投票

或者您可以允许该许可发布此帖子请求。

注意:应该在您不需要验证用户在我们的服务器上发布任何内容的情况下使用,例如,当新用户第一次注册时。

from rest_framework.permissions import AllowAny

class CreateUser(APIView):
    permission_classes = (AllowAny,)
    def post(self, request, format=None):
        return(Response("hi"))

进一步注意,如果要将该发布请求形成为不同的域(如果应用程序的前面是React或angular,后端是Django),请确保在设置文件中添加以下内容:

  1. 更新INSTALLED_APPS以使用'coreHeaders': INSTALLED_APPS = [ 'corsheaders', ]
  2. 通过再次将以下内容添加到设置文件,白名单列出您的前端域: CORS_ORIGIN_WHITELIST =('localhost:8080',)

0
投票

Django文档提供了几种确保包含CSRF令牌的方法。有关详细信息,请参阅https://docs.djangoproject.com/en/1.11/ref/csrf/


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/

取决于令牌类型。

© www.soinside.com 2019 - 2024. All rights reserved.