Aggiunta di intestazioni a Django CBV
-
02-01-2020 - |
Domanda
Voglio aggiungere un'intestazione X-Frame-Options
a Django Createview.Ho bisogno di questo perché serverò una forma che verrà caricata in tag IFrame.
Il problema è che ci sono diversi metodi nelle viste basate sulla classe Django che restituiscono gli oggetti httpresponse. C'è un modo per aggiungere l'intestazione alle risposte senza sovrascrivere Tutto Questi metodi?
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...
. Soluzione
Okay, l'ho risolto.Se hai riscontrato un problema simile, ecco come farlo.
Devi sovrascrivere il metodo render_to_response
nello stesso modo in cui ho fatto con arrivi nel codice di esempio sopra.
Altri suggerimenti
Ho provato il rendering di sovrascrittura al metodo di risposta, ma volevo una soluzione che potrei usare per un intero pezzo di URL mappato in diverse viste, e non devi affrontare la sovrascrittura dello stesso metodo su diverse viste.
Ho fatto una classe middleware basata su django-cors -Weader Quindi potrei consentire l'iframe di parte della mia app Django. Tenendo un middleware.py nella mia principale directory del progetto e salvo una coppia classi di middleware casuali che ho fatto lì, come questo qui e un Eccezione forcesponse per esempio.
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)
.
aggiungilo al tuo middleware_classes e configurare la regex nelle impostazioni:
MIDDLEWARE_CLASSES = (
...
'your_django_app.middleware.XFrameAllowMiddleware',
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...
)
XFRAME_URLS_REGEX = r'^/iframe_this_url/.*$'
.
Dalle intestazioni Django-Cors-Corsed.me:
.Cors_urls_regex: specificare un URL Regex per il quale abilitare l'invio di intestazioni dei cors; Utile quando vuoi solo abilitare i cors per gli URL specifici, e. g. Per un API di riposo sotto / API /. Esempio:
CORS_URLS_REGEX = r'^/api/.*$'
.
.Impostazione predefinita:
CORS_URLS_REGEX = '^.*$'
.