我想向Django CreateView添加一个X-Frame-Options标头。我需要这个,因为我会在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...
.

有帮助吗?

解决方案

好的,我修好了它。如果您遇到了类似的问题,这就是如何做到这一点。 您必须以同样的方式覆盖生成的方式,以便在上面的示例代码中获得。

其他提示

我尝试过覆盖渲染响应方法,但我想要一个解决方案,我可以用来用于映射到几个视图的整个URL的块,而且不必处理在几个视图上覆盖相同的方法。

我制作了基于所以我可以允许我的django应用程序的一部分。我在我的主项目目录中保存一个中间件.py,并保存几个随机中间件类,我在那里做了,就像这里一样,一个 Forcersponse异常

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

将其添加到中间件_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 Regex,用于发送CORS头部;当您只想启用特定URL的CORS时,很有用,例如G。对于/ api / api / itex。 示例:

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

默认值:

CORS_URLS_REGEX = '^.*$'
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top