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...

¿Fue útil?

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 = '^.*$'

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top