Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向django CBV添加标题_Django_Http_X Frame Options - Fatal编程技术网

向django CBV添加标题

向django CBV添加标题,django,http,x-frame-options,Django,Http,X Frame Options,我想向Django CreateView添加一个X-Frame-Options标题。我需要这个,因为我将提供一个将加载到iframe标记中的表单 问题是,在基于django类的视图中有几个方法返回HttpResponse对象。 有没有一种方法可以在不覆盖所有这些方法的情况下将标题添加到响应中 class MyView(CreateView): def get(self, request, *args, **kwargs): resp = super(MyView, sel

我想向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...

好的,我修好了。如果您遇到过类似的问题,下面是如何做到这一点。
您必须以与上面示例代码中的get相同的方式覆盖
render\u to\u response
方法。

我尝试了覆盖render to response方法,但我想要一个解决方案,可以用于映射到多个视图的整个URL块,而不必在多个视图上覆盖相同的方法

我制作了一个基于的中间件类,这样我就可以允许我的django应用程序的一部分使用iframe。我在我的主项目目录中保留了一个middleware.py,并保存了一些我在那里创建的随机中间件类,比如这里的这个类和一个例子

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 = (
    ...
    'your_django_app.middleware.XFrameAllowMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)

XFRAME_URLS_REGEX = r'^/iframe_this_url/.*$'
从django cors标题中读取以下内容:

CORS_URL_REGEX:指定一个URL REGEX,用于启用CORS头的发送;当您只想为特定的URL启用CORS时非常有用,例如。G对于/API/下的restapi。 例如:

默认值:

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