Django CBV에 헤더 추가하기
-
02-01-2020 - |
문제
Django CreateView에 X-Frame-Options
헤더를 추가하고 싶습니다.iframe 태그에로드 될 양식을 제공하기 때문에 필자가 필요합니다.
문제는 httpresponse 객체를 반환하는 Django 클래스 기반 뷰에서 몇 가지 방법이 있습니다. 을 덮어 쓰지 않고 응답에 헤더를 추가하는 방법이 있습니까?
class MyView(CreateView):
def get(self, request, *args, **kwargs):
resp = super(MyView, self).get(request, *args, **kwargs)
resp['X-Frame-Options'] = ''
return resp
# Same would go for form_invalid, post, put, etc...
. 해결책
괜찮아, 나는 그것을 고쳤다.비슷한 문제가 발생하면이를 수행하는 방법이 있습니다.
위의 예제 코드에서 얻은 것과 동일한 방식으로 render_to_response
메소드를 덮어 쓸 필요가 있습니다.
다른 팁
Ressting 메서드로 덮어 쓰기 렌더링을 시도했지만 여러보기에 매핑 된 URL 전체 덩어리에 사용할 수있는 솔루션을 원했고 몇 가지보기에 대해 동일한 메소드를 겹쳐 쓰지 않아도됩니다.
나는 Django-pors를 기반으로 한 미들웨어 클래스를 만들었습니다. - 헤더 그래서 Django 앱의 일부를 iframe-ing을 허용 할 수 있습니다. My Main Project 디렉토리에 MiddleWare.py를 유지 하고이 여기 에서이 forceresponse 예외 예외 .
import re
from django import http
from django.conf import settings
class XFrameAllowMiddleware(object):
def process_request(self, request):
"""
If CORS preflight header, then create an
empty body response (200 OK) and return it
Django won't bother calling any other request
view/exception middleware along with the requested view;
it will call any response middlewares
"""
if (self.is_enabled(request) and
request.method == 'OPTIONS' and
"HTTP_ACCESS_CONTROL_REQUEST_METHOD" in request.META):
response = http.HttpResponse()
return response
return None
def process_response(self, request, response):
if self.is_enabled(request):
response['X-Frame-Options'] = 'ALLOWALL'
return response
def is_enabled(self, request):
return re.match(settings.XFRAME_URLS_REGEX, request.path)
.
middleware_classes에 추가하고 설정에서 정규식을 구성합니다.
MIDDLEWARE_CLASSES = (
...
'your_django_app.middleware.XFrameAllowMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
XFRAME_URLS_REGEX = r'^/iframe_this_url/.*$'
.
django-cors-headers read.me에서 read.me :
CORS_URLS_REGEX : CORS 헤더를 송신 할 수있는 URL 정규식을 지정합니다. 특정 URL에 대해 CORS 만 활성화하려면 유용합니다. 지. REST API는 / API /. 예 :
CORS_URLS_REGEX = r'^/api/.*$'
.
기본값 :
CORS_URLS_REGEX = '^.*$'
.