Pergunta

Eu quero adicionar uma X-Frame-Options cabeçalho para Django CreateView.Eu preciso disso porque eu vou estar servindo a um formulário, que será carregado em tags iframe.

O problema é que, há vários métodos em django classe baseada em vista que return HttpResponse objetos.Existe uma maneira de adicionar o cabeçalho para as respostas sem substituir todos esses 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...
Foi útil?

Solução

Ok, eu fixo ele.Se você já encontrou um problema semelhante, aqui está como fazê-lo.Você tem que substituir render_to_response método mesma forma que eu fiz com a entrar no exemplo de código acima.

Outras dicas

Eu tentei substituir render ao método de resposta, mas eu queria uma solução que eu poderia usar para um bloco completo de urls mapeada para vários pontos de vista, e não ter que lidar com a substituição o mesmo método em vários pontos de vista.

Eu fiz um middleware baseado em classe fora de django-cors-cabeçalhos então eu poderia permitir iframe-ing da parte de meu django app.Eu mantenho um middleware.py no meu projeto principal de diretório e salvar um par aleatório de middleware classes de eu ter feito lá, como este aqui e um ForceResponse Exceção por exemplo.

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)

Adicione ao seu MIDDLEWARE_CLASSES e configurar o regex em suas configurações:

MIDDLEWARE_CLASSES = (
    ...
    'your_django_app.middleware.XFrameAllowMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)

XFRAME_URLS_REGEX = r'^/iframe_this_url/.*$'

a partir do django-cors-cabeçalhos de leitura.me:

CORS_URLS_REGEX:especifique um URL regex para habilitar o envio de CORS cabeçalhos;Útil quando você deseja habilitar o CORS para URLs específicas, e.g.para uma API de REST em /api/.Exemplo:

CORS_URLS_REGEX = r'^/api/.*$'

Padrão:

CORS_URLS_REGEX = '^.*$'
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top