Как настроить X-Frame-Options в Django, чтобы разрешить встраивание iframe в одно представление?

Я пытаюсь включить 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)

что не помогает, насколько я понимаю, потому что позволяет встраивать только на тот же сервер.

Как я могу установить заголовки для этого конкретного представления, чтобы его можно было встроить в любой веб-сайт?

Для справки, я всего лишь фронтенд-разработчик, бэкэнд-разработчик, разработавший сайт, больше не работает со мной и отказался документировать свой код, поэтому, если кто-нибудь может мне помочь и подробно объяснить, где и какие модификации я должен сделать, Я очень признателен.

Спасибо.

Насколько я знаю, версия Джанго 1.6.


person Community    schedule 21.10.2015    source источник


Ответы (3)


Вы идете в правильном направлении, но для этого вам понадобится декоратор 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 больше не поддерживается. Это хорошее время, чтобы получить обновление.

person iankit    schedule 21.10.2015
comment
Я думаю, нам нужен декоратор для ALLOW-FROM параметров iframe developer.mozilla.org/ru/docs/Web/HTTP/Headers/X-Frame-Options определить допустимые домены, а не просто удалить заголовок X-Frame, пожалуйста, кто-нибудь, создайте тикет (у меня нет доступа ) - person LennyLip; 11.09.2016

По-видимому, вы можете установить правило в настройках, говорящее следующее:

X_FRAME_OPTIONS = 'ALLOW-FROM https://example.com/'

Также в настоящее время вам следует подумать о переходе на CSP.

Content-Security-Policy: frame-ancestors 'self' example.com *.example.net ;

См. https://stackoverflow.com/a/25617678/186202.

person Natim    schedule 09.02.2018
comment
ALLOW-FROM не поддерживает Chrome и Safari. - person Sarath Ak; 15.11.2018

Если вы хотите разрешить фрейм в определенном представлении, вы можете добавить Content-Security-Policy в свой ответ на представление, поэтому ваш код будет примерно таким

def MyView(request):
    ....
    ....
    response = render(request,'MyViewHtml.html' ,{...})
    response ['Content-Security-Policy'] = "frame-ancestors 'self' https://example.com"
person Fouad Selmane    schedule 13.02.2021