Добавление заголовков в django CBV
-
02-01-2020 - |
Вопрос
Я хочу добавить 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 = '^.*$'