我在另一个网站上有一个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);
}
});
不确定要添加什么,请在评论中提问。
我做错了什么,还是我对事物的理解?
答案 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解决了这个问题。