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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top