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

Python Django在发送POST请求时返回403错误,python,django,http-status-code-403,http-post,Python,Django,Http Status Code 403,Http Post,当我使用下面的Python代码向我的Django网站发送POST请求时,我得到了403:禁止的错误 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_pag

当我使用下面的Python代码向我的Django网站发送POST请求时,我得到了403:禁止的错误

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配置的问题,有人能告诉我应该怎么做才能提供对脚本的访问吗?

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

看这里

请尝试使用
@csrf\u-emption
标记您的视图。这样,Django的CSRF中间件将忽略CSRF保护。您还需要使用django.views.decorators.csrf import csrf_export的
。见:

请注意,通过在您的视图上禁用CSRF保护,您为CSRF攻击打开了一扇大门


如果安全性对你至关重要,那么考虑使用<代码> @ CSRFX豁免后面跟着“代码> @ AddiSrsCsffToMe/<代码>(参见:)。然后,在脚本中传递这个令牌,就这样。

响应是403,因为django在您发出的每个post请求中都需要一个csrf令牌(包含在post数据中)

有多种方法可以做到这一点,例如:

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

或者,您也可以允许进行此post请求的权限

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

from rest_framework.permissions import AllowAny

class CreateUser(APIView):
    permission_classes = (AllowAny,)
    def post(self, request, format=None):
        return(Response("hi"))
进一步注意,如果要使post请求形成不同的域(如果应用程序的前端为React或angular,后端为Django),请确保在设置文件中添加以下内容:

  • 更新已安装的应用程序以使用“coreHeaders”:

    已安装的应用程序=[
    “corsheaders”,
    ]

  • 通过再次向设置文件中添加以下内容,将前端域列为白名单:

    CORS\u来源\u白名单=( '本地主机:8080', )


  • Django文档提供了几种确保包含CSRF令牌的方法。有关详细信息,请参阅。

    当身份验证令牌过期或请求中未发送令牌时,我遇到此错误。使用更新的令牌修复了该问题

    curl -X POST -H "Authorization: Token mytoken" -d "name=myname&age=0" 127.0.0.1:8000/myapi/
    


    取决于令牌类型。

    我也有这个问题,因为我试图使用
    '../url'
    url跳转从另一个端点访问主端点。 我的解决方案是为同一视图集添加另一个路径

    router.register('main/url',ViewSet,'name');
    router.register('secondary/url',ViewSet,'name')
    

    但在您的情况下,您试图从Django的角度从完全不同的位置访问它,因此您需要使用
    @crsf_-emption
    中间件标记您的视图集,该中间件将禁用与crsf相关的安全协议。

    您可以从普通的web浏览器访问该网页吗?我可以从普通浏览器访问。我的服务器日志是空的,我没有足够的piriveges在我的主机上查看所有日志。我应该在哪里添加该标记?如果在模板中-它不工作。这是我的观点:,t.html只是{{form}你能更新原始问题以包含你的代码(视图、URL、表单)和html而不是链接到dpast吗?@Djent为什么t.html只是一个{{form}它包含在其他页面中吗?如果你只是把{form}放进去,它不是一个有效的网页,甚至不是一个有效的表单,因为{form}只是放了表单元素,你仍然需要在它周围添加表单标签。如果是csrf问题,你可以尝试暂时在视图上禁用csrf,看看是否有效,如果有效,那么你就知道问题是什么了。有关更多帮助,请参阅本文档。回答正确。非常感谢您分享以上两个链接。我的代码在从django.views.decorators.csrf import csrf_protect添加这个导入语句之后运行得非常好,并且在像@csrf_export这样豁免特定函数之后再次感谢大家。
    router.register('main/url',ViewSet,'name');
    router.register('secondary/url',ViewSet,'name')