Frage

Ich möchte eine hinzufügen X-Frame-Options Header zu Django CreateView.Ich brauche das, weil ich ein Formular bereitstellen werde, das in Iframe-Tags geladen wird.

Das Problem besteht darin, dass es in klassenbasierten Django-Ansichten mehrere Methoden gibt, die HttpResponse-Objekte zurückgeben.Gibt es eine Möglichkeit, den Header zu den Antworten hinzuzufügen, ohne ihn zu überschreiben? alle diese Methoden?

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...
War es hilfreich?

Lösung

Okay, ich habe es behoben.Wenn Sie auf ein ähnliches Problem gestoßen sind, erfahren Sie hier, wie Sie es beheben können.Du musst überschreiben render_to_response Methode auf die gleiche Weise, wie ich es mit get im Beispielcode oben gemacht habe.

Andere Tipps

Ich habe die Render-zu-Antwort-Methode „Overwrite“ ausprobiert, wollte aber eine Lösung, die ich für einen ganzen Teil der URLs verwenden kann, die mehreren Ansichten zugeordnet sind, und mich nicht mit dem Überschreiben derselben Methode in mehreren Ansichten befassen muss.

Ich habe eine Middleware-Klasse erstellt, die darauf basiert Django-Cors-Header So konnte ich das Iframe-ing eines Teils meiner Django-App zulassen.Ich behalte eine middleware.py in meinem Hauptprojektverzeichnis und speichere ein paar zufällige Middleware-Klassen, die ich dort erstellt habe, wie diese hier und eine ForceResponse-Ausnahme Zum Beispiel.

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)

Fügen Sie es zu Ihren MIDDLEWARE_CLASSES hinzu und konfigurieren Sie den regulären Ausdruck in Ihren Einstellungen:

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

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

aus den Django-Cors-Headern read.me:

CORS_URLS_REGEX:Geben Sie einen URL-Regex an, für den das Senden von CORS-Headern aktiviert werden soll.Nützlich, wenn Sie CORS nur für bestimmte URLs aktivieren möchten, z.G.für eine REST-API unter /api/.Beispiel:

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

Standard:

CORS_URLS_REGEX = '^.*$'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top