我正在尝试启用django以允许将一个特定视图嵌入到外部站点上,优先考虑没有站点限制。
在我的views.py文件中,我添加了以下代码,其中视图futurebig是我想要嵌入的那个:
from django.views.decorators.clickjacking import xframe_options_sameorigin
...
@xframe_options_sameorigin
def futurebig(request):
...
return render_to_response('templates/iframe/future_clock_big.html', context_dict, context)
这根本无法理解,因为它只能在同一台服务器中嵌入。
如何设置特定视图的标题以使其嵌入任何网站?
为了记录,我只是一个前端开发人员,开发该网站的后端开发人员不再与我合作并拒绝记录他的代码,因此,如果有人可以帮助我并仔细解释我应该在哪里做什么修改,我会非常感激。
谢谢。
据我所知,Django版本是1.6
你正朝着正确的方向前进,但你需要实现的精确装饰是'xframe_options_exempt'。
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def ok_to_load_in_a_frame(request):
return HttpResponse("This page is safe to load in a frame on any site.")
PS:不再支持DJango 1.6。现在是升级的好时机。
显然,您可以在设置中设置一条规则,说明如下:
X_FRAME_OPTIONS = 'ALLOW-FROM https://example.com/'
现在你也应该考虑转向CSP
Content-Security-Policy: frame-ancestors 'self' example.com *.example.net ;
最新的Internet浏览器具有内置的HTTP标头系统X-Frame-Options,可以将其视为允许您在框架或iframe中加载资源的设置。标头有两个值:
如果响应中尚未存在X-Frame-Options HTTP标头,则只能由中间件或视图装饰器设置。
要为站点中的所有响应设置相同的X-Frame-Options值,请将django.middleware.clickjacking.XFrameOptionsMiddleware
放入MIDDLEWARE
:
MIDDLEWARE = [
...
'django.middleware.clickjacking.XFrameOptionsMiddleware',
...
]
上面显示的middleware
将为每个SAMEORIGIN
将X-Frame-Options标题值设置为HttpResponse
。如果您的要求是要使用DENY
代替它,您始终可以将此设置设置为所需的值。
X_FRAME_OPTIONS = 'DENY'
您可能需要某些视图,而不希望设置X-Frame-Options标头值。对于这种情况,Django提供了视图装饰器,指示中间件不设置标头。
from django.http import HttpResponse
from django.views.decorators.clickjacking import xframe_options_exempt
@xframe_options_exempt
def let_load_in_an_iframe(request):
return HttpResponse("This page is safe to load in an iframe on any site.")
@xframe_options_deny
和@xframe_options_sameorigin
是Django提供的除@xframe_options_exempt
之外的其他装饰器,用于在选择视图的基础上设置X-Frame-Options标头。