我正在尝试启用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
答案 0 :(得分:32)
你正朝着正确的方向前进,但你需要做的确切的装饰是' 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。现在是升级的好时机。
答案 1 :(得分:12)
显然,您可以在设置中设置一条规则,说明如下:
X_FRAME_OPTIONS = 'ALLOW-FROM https://example.com/'
现在你也应该考虑转向CSP
Content-Security-Policy: frame-ancestors 'self' example.com *.example.net ;
答案 2 :(得分:2)
最新的Internet浏览器具有HTTP标头X-Frame-Options的内置系统,可以将其视为允许您允许在框架或iframe中加载资源的设置。 标头采用两个值:
SAMEORIGIN 将导致许可,如果且仅当请求来自主站点时,才可以将资源加载到框架中。
拒绝将导致阻止以任何类型的框架或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标头。
答案 3 :(得分:0)
如果您想在特定视图中允许框架,您可以将 Content-Security-Policy 添加到您的视图响应中,因此您的代码将是这样的
def MyView(request):
....
....
response = render(request,'MyViewHtml.html' ,{...})
response ['Content-Security-Policy'] = "frame-ancestors 'self' https://example.com"