CORS标头不适用于Django项目

时间:2017-06-15 17:51:16

标签: javascript python ajax django iframe

我在另一个网站上有一个iframe。我可以控制那个iframe的代码,但不能控制网站本身,,它的来源不是我的网站(它是从另一个域加载的)。在iframe中,对其他网站进行了几次ajax API调用,并在我自己的基于Django的网站上发出了一个 GET 请求。但是,此调用会返回错误代码0.请求甚至不会记录在网络浏览器标签中(我使用的是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);
    }
  });

不确定要添加什么,请在评论中提问。

我做错了什么,还是我对事物的理解?

2 个答案:

答案 0 :(得分:0)

这是中间件的原因

'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):

答案 1 :(得分:0)

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