A adição de cabeçalhos para django CBV
-
02-01-2020 - |
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...
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 = '^.*$'