【问题标题】:Getting the request origin in a Django request在 Django 请求中获取请求源
【发布时间】:2014-02-05 18:50:11
【问题描述】:

所以我正在尝试在Django中启用跨源资源共享,这样我就可以发布到外部站点,并且当我设置时很容易做到

response["Access-Control-Allow-Origin"]="*" 

但我想让它检查来源是否在允许的来源列表中(本质上是将其限制为仅允许特定站点),但我似乎无法在 Django 请求中找到可以获取产地信息。

我尝试使用 request.META['HTTP_HOST'] 但这只会返回要发布到的站点。有谁知道我可以在 Request 对象的哪个位置获取请求的来源?

【问题讨论】:

    标签: javascript python django post cross-domain


    【解决方案1】:

    在 Django 2.2 中使用:

    request.META.get('HTTP_REFERER')
    

    确保请求属性没有 mode = no-cors

    见:

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin

    “上述规则有一些例外情况,例如,如果在no-cors模式下进行跨域GET或HEAD请求,则不会添加Origin头。”

    【讨论】:

      【解决方案2】:

      可以通过request.META{"HTTP_ORIGIN"]得到它

      【讨论】:

        【解决方案3】:

        在 Django 中,

        request.headers['Origin']
        

        回答最初的问题。

        您可以print(request.headers)查看标题中的所有可用内容。

        【讨论】:

          【解决方案4】:

          至于从request(我一直在寻找)获取网址,请改用request.META['HTTP_REFERER']

          【讨论】:

          • 这会返回一个 KeyError
          • 你使用的是什么版本的 Django?如果你打印request.META.keys(),你会得到什么?这是关于请求元数据的文档:docs.djangoproject.com/en/1.9/ref/request-response/…
          • @ZAD-Man 可能他遇到了来自 django 测试的 KeyError,在这种情况下没有 HTTP_REFERER。无论如何我不确定,但我认为他应该使用 REMOTE_HOST 来获得他想要的东西。
          • @Ness - 啊,好的,我可以看到。
          【解决方案5】:

          要回答“有谁知道我可以在 Request 对象的哪个位置获取请求的来源吗?”这个问题,request.META['REMOTE_ADDR'] 会满足您的需求吗?

          【讨论】:

          • 不起作用,它提供的是 IP 地址,而不是主机名。
          【解决方案6】:

          我强烈建议您使用django-cors-headers。它允许您定义CORS_ORIGIN_WHITELIST,这是一个以更 Python 方式的允许来源列表。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-05-30
            • 2016-08-01
            • 2016-05-01
            • 2011-05-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-08-10
            相关资源
            最近更新 更多