Añadiendo encabezados a Django CBV
-
02-01-2020 - |
Pregunta
Quiero agregar un encabezado X-Frame-Options
a Django Createview.Necesito esto porque estaré sirviendo a un formulario que se cargará en las etiquetas de Iframe.
El problema es que hay varios métodos en las vistas basadas en la clase Django que devuelven los objetos HTTPRESPONSE. ¿Hay alguna manera de agregar el encabezado a las respuestas sin sobrescribir todos esos métodos?
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...
Solución
Bien, lo arreglé.Si has encontrado un problema similar, aquí es cómo hacerlo.
Debe sobrescribir el método render_to_response
de la misma manera que lo hice con obtener el código de ejemplo anterior.
Otros consejos
Probé el método de sobrescritura para responder a la respuesta, pero quería una solución que pudiera usar para un trozo completo de URL asignado a varias vistas, y no tener que lidiar con sobrescribir el mismo método en varias vistas.
Hice una clase de middleware basada en django-cors -HEADERS Así que podría permitir que IFRAME-ING de la parte de mi aplicación Django. Mantengo un middleware.py en mi directorio principal del proyecto y guardo una pareja Clases de middleware aleatorias que he realizado allí, como este aquí y un ForceSponse Exception Por ejemplo.
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)
Agreguelo a su Middleware_Classes y configure el Regex en su configuración:
MIDDLEWARE_CLASSES = (
...
'your_django_app.middleware.XFrameAllowMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
XFRAME_URLS_REGEX = r'^/iframe_this_url/.*$'
de los encabezados DJANGO-CORS READ.ME:
CORS_URLS_REGEX: Especifique una REGEX URL para la cual permitir el envío de encabezados de CORS; Útil cuando solo desea habilitar las URL específicas, e. gramo. para una API de descanso bajo / API /. Ejemplo:
CORS_URLS_REGEX = r'^/api/.*$'
Predeterminado:
CORS_URLS_REGEX = '^.*$'