【问题标题】:Django Localhost CORS not workingDjango 本地主机 CORS 不工作
【发布时间】:2016-04-14 14:06:17
【问题描述】:

我有一个本地 Django 设置如下

Django Rest Framework:localhost:8000

AngularJS frontend:local apache running on http://localservername

我已经安装了django-cors-headers 并在我的settings.py 中设置了我的

CORS_ORIGIN_WHITELIST = (
    'http://localhost',
    'localservername',
    'http://localservername',
    '127.0.0.1'
)


MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

但是,每当我点击从 Rest Framework 提供的任何 API 时,都会收到 No 'Access-Control-Allow-Origin' header is present on the requested resource. 错误。如果我设置CORS_ORIGIN_ALLOW_ALL = True,那么 API 可以正常工作,但这对我的服务器端数据来说是非常不安全的。

我需要改变什么来解决这个问题?

【问题讨论】:

  • 您是否在INSTALLED_APPS 中的django.middleware.common.CommonMiddleware 和corsheaders 之前添加了corsheaders.middleware.CorsMiddleware?
  • @DaniilRyzhkov,是的,我有,我会把它添加到我的问题中
  • @HamletHakobyan,这没关系,因为我的请求是从 localservername 到 localhost:8000
  • 尝试删除'http://localservername',和'http://localhost',行

标签: python django cors django-cors-headers


【解决方案1】:

根据http://www.w3.org/Security/wiki/Same_Origin_Policy,请求应该来自相同的端口、方案和主机,才能被视为同一来源。这里你的一台服务器在 80 端口,另一台在 8080 端口。

来源由 URL 的方案、主机和端口定义。一般来说 说起来,从不同来源检索到的文档与 彼此。例如,如果从 http://example.com/doc.html 尝试访问文档的 DOM 从https://example.com/target.html 检索,用户代理将 禁止访问,因为第一个文档的来源,(http, example.com, 80),与第二个文档的来源不匹配 (https,example.com,443)。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。通过浏览django-cors-headers-code发现我的错误如下:

    虽然完整的 CORS 标头看起来像这样(注意架构和主机名):

    Access-Control-Allow-Origin: https://example.com
    

    CORS_ORIGIN_WHITELIST 设置希望它的格式与 Origin-header 的 urlparse.netloc (docs) 相比,后者只是主机(可能是端口)

    def origin_found_in_white_lists(self, origin, url):
        return (
            url.netloc in conf.CORS_ORIGIN_WHITELIST or
            (origin == 'null' and origin in conf.CORS_ORIGIN_WHITELIST) or
            self.regex_domain_match(origin)
        )
    

    RegEx-whitelist 将其与完整的 Origin-header 进行比较。

    因此正确的设置(如设置手册中的示例正确说明,但未正确描述)将是:

    CORS_ORIGIN_WHITELIST = (
        'example.com',
    )
    

    如果您不希望您的 API 与网站的非安全 http 版本通信,这可能是个问题。在这种情况下使用 RegEx。

    另请注意:在故障排除过程中,我发现如果找不到匹配项,CORS 标头完全不存在。这意味着没有标头并不能确定中间件完全故障,而可能只是配置错误。

    【讨论】:

      【解决方案3】:

      也许大括号很重要

      [] 代替 ()

      CORS_ORIGIN_WHITELIST = [
      
          'http://localhost',
      
          'localservername',
      
          'http://localservername',
      
          '127.0.0.1'
      
      ]
      

      应该有效

      【讨论】:

        【解决方案4】:

        大括号对我来说很重要,使用 [] 而不是 (), 我已经在 Django 中验证过, 其他我没有检查过。

        这样写:

        CORS_ORIGIN_WHITELIST=[ 'https://localhost:3000' ]

        【讨论】:

          【解决方案5】:

          CORS_ORIGIN_WHITELIST=[ 'https://localhost:3000' ] 它工作正常。

          【讨论】:

            【解决方案6】:

            这对我有用,请检查一下,它可能会帮助您解决问题。

            CORS_ORIGIN_WHITELIST = (
                'http://localhost',
            )
            

            【讨论】:

              【解决方案7】:

              在这个错误中,提示清楚地提到它需要https://

              HINT: Add a scheme (e.g. https://) or netloc (e.g. example.com).
              

              此外,大括号在 django 设置中也很重要。

              CORS_ORIGIN_WHITELIST = [
                  'https://localhost:3000'
              ]
              

              以上设置工作正常。

              虽然不同括号的相同设置不起作用

              CORS_ORIGIN_WHITELIST = (
                  'https://localhost:3000'
              )
              

              【讨论】:

                【解决方案8】:

                像这样写 CORS_ORIGIN_WHITELIST = ['https://localhost:3000'] 对我来说很好。

                【讨论】:

                  【解决方案9】:

                  从django-cors-headers documentation复制白名单代码,然后修改即可:

                  CORS_ORIGIN_WHITELIST = [
                      "https://example.com",
                      "https://sub.example.com",
                      "http://localhost:8080",
                      "http://127.0.0.1:9000"
                  ]
                  

                  这将保证您没有打错任何字。

                  【讨论】:

                    【解决方案10】:

                    对我来说,我使用 [] 而不是 ()。 也不要在最后的 url 中添加“/”。

                    类似的东西

                    CORS_ORIGIN_WHITELIST = [
                        'http://localhost:3000'
                    ]
                    

                    【讨论】:

                      【解决方案11】:

                      确保不要添加路径/,如下所示:

                      CORS_ORIGIN_WHITELIST = (
                          'https://localhost:3000/'
                      )
                      

                      只需添加以下代码即可。

                      CORS_ORIGIN_WHITELIST = [
                          'https://localhost:3000'
                      ]
                      

                      【讨论】:

                        猜你喜欢
                        • 2014-07-25
                        • 2018-08-01
                        • 1970-01-01
                        • 2015-10-15
                        • 2018-06-27
                        • 2017-11-06
                        • 2015-10-03
                        • 2013-05-31
                        相关资源
                        最近更新 更多