【问题标题】:CORS headers not working on Django projectCORS 标头不适用于 Django 项目
【发布时间】:2017-06-15 17:51:15
【问题描述】:

我在另一个网站上有一个 iframe。我可以控制该 iframe 的代码,但不能控制网站本身,它的来源不是我的网站(它是从另一个域加载的)。在 iframe 中,对其他网站进行了几次 ajax API 调用,并对我自己基于 Django 构建的网站发出了一个 GET 请求。但是,此调用返回代码 0 的错误。该请求甚至没有记录在 network 浏览器选项卡中(我使用 Firefox)。

在 Django 网站上运行同样的程序效果很好,所以很明显问题出在跨域请求中。我添加并启用了django-cors-headers 模块,但它仍然不起作用。抛出了同样的错误,但实际上什么也没发生。

我的 Django 版本是 1.10.5。通过 pip 为 Python3.5 安装的模块。整个过程都在 VPS 上运行。设置:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'install',
    'account',
    'corsheaders',
]
MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
CORS_ORIGIN_ALLOW_ALL = True
CSRF_TRUSTED_ORIGINS = (
    'https://widget.insales.ru',
)

请求:

$.ajax({
    type: "GET",
    url: "http://project_url/scripty",
    data: {
      "data": JSON.stringify(r)
    },
    dataType: 'text/plain',
    success: function(data){
      console.log(JSON.stringify(r));
      console.log("Success!");
      console.log(data);
    },
    error: function(xhr, status, errorThrown){
      console.log(JSON.stringify(r));
      console.log("Status: " + status + "\nThrown: " + errorThrown);
      console.log(xhr);
    }
  });

不确定要添加什么,所以在 cmets 中询问。

是我做错了什么还是我对事物的理解有问题?

【问题讨论】:

    标签: javascript python ajax django iframe


    【解决方案1】:

    这个问题出乎意料地轻松解决了。很长一段时间后,我终于尝试从 Chrome 发出相同的请求,并看到一直以来我一直在尝试从 secure 调用不安全的资源。这意味着 iframe 是用 https 加载的,请求是用 http 发出的。为请求的站点激活 SSL 解决了这个问题。

    【讨论】:

      【解决方案2】:

      这是中间件的原因

      'django.middleware.clickjacking.XFrameOptionsMiddleware',
      

      Django 不允许使用 django 网站作为 iframe 标签。因为django有中间件

      'django.middleware.clickjacking.XFrameOptionsMiddleware',
      

      不允许使用 iframe 标签将 django 网站加载到另一个网站。它在页面加载时检查 SAMEORIGIN。阅读有关此主题的完整信息https://docs.djangoproject.com/en/1.11/ref/clickjacking/

      您可以使用装饰器在 iframe 中渲染特定视图

      from django.views.decorators.clickjacking import xframe_options_exempt
      
        @xframe_options_exempt
        def ok_to_load_in_a_frame(request):
      

      【讨论】:

      • 有一点我忘了说。这个 iframe 的来源不是我的网站。我可以控制它,但它是从另一个域加载的。我将编辑问题
      • 如果您想在 iframe 标记中将您的 django 网站显示到另一个域,请使用装饰器或删除中间件。
      • 不,你不明白。假设我的网站名称是 a.com。我使用特殊工具将我的代码上传到域 b.comb.com 将其显示在从 widget.b.com加载的 iframe 中>。所以基本上我需要从 widget.b.coma.com 发出请求,但我不能。 Django 与 iframe 无关。而且显示没有问题
      • 或者我明白你试图告诉我什么吗?我把那个中间件注释掉了,没用
      • 您的意思是 b.com 显示在 widget.b.com 的 iframe 标记中。对吗?
      猜你喜欢
      • 2018-11-23
      • 2018-11-01
      • 2017-09-24
      • 2020-01-08
      • 2020-04-22
      • 2019-01-09
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多