Вопрос

Я хочу добавить X-Frame-Options заголовок для Django CreateView.Мне это нужно, потому что я буду обслуживать форму, которая будет загружена в теги iframe.

Проблема в том, что в представлениях на основе классов django есть несколько методов, которые возвращают объекты HttpResponse.Есть ли способ добавить заголовок к ответам без перезаписи все эти методы?

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...
Это было полезно?

Решение

Ладно, я все исправил.Если вы столкнулись с подобной проблемой, вот как это сделать.Вы должны перезаписать render_to_response метод таким же образом, как я сделал с get в примере кода выше.

Другие советы

Я попробовал перезаписать метод рендеринга в ответ, но мне нужно было решение, которое я мог бы использовать для целого фрагмента URL-адресов, сопоставленных нескольким представлениям, и не иметь дело с перезаписью одного и того же метода в нескольких представлениях.

Я создал класс промежуточного программного обеспечения, основанный на django-cors-заголовки таким образом, я мог бы разрешить создание фреймворка для части моего приложения django.Я храню промежуточное программное обеспечение.py в моем главном каталоге проекта и сохраняю пару случайных классов промежуточного программного обеспечения, которые я создал там, например, этот здесь и Исключение ForceResponse например.

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)

Добавьте его в свои MIDDLEWARE_CLASSES и настройте регулярное выражение в своих настройках:

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

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

из django-cors-заголовков read.me:

CORS_URLS_REGEX:укажите регулярное выражение URL, для которого следует включить отправку заголовков CORS;Полезно, когда вы хотите включить CORS только для определенных URL-адресов, например.g.для REST API в разделе /api/.Пример:

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

По умолчанию:

CORS_URLS_REGEX = '^.*$'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top