我想为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...
答案 0 :(得分:2)
好的,我修好了。如果您遇到类似问题,请按照以下步骤操作。 你必须像上面的示例代码一样覆盖render_to_response方法。
答案 1 :(得分:0)
我尝试了覆盖渲染到响应方法,但我想要一个解决方案,我可以用于映射到多个视图的整个网址,而不必处理在多个视图上覆盖相同的方法。
我根据django-cors-headers创建了一个中间件类,所以我可以允许我的django app的部分iframe。我在我的主项目目录中保留了一个middleware.py并保存了一些我在那里制作的随机中间件类,例如这里的一个和ForceResponse Exception。
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-headers read.me:
CORS_URLS_REGEX:指定要为其启用CORS标头发送的URL正则表达式;当您只想为特定URL启用CORS时很有用,例如: G。对于/ api /下的REST API。 例如:
CORS_URLS_REGEX = r'^/api/.*$'
默认值:
CORS_URLS_REGEX = '^.*$'