Django CBVにヘッダーを追加する
-
02-01-2020 - |
質問
Django CreateViewにX-Frame-Options
ヘッダーを追加したい。iFrameタグにロードされるフォームにサービスを提供するため、これが必要です。
問題は、Httpresponseオブジェクトを返すDjangoクラスベースのビューにいくつかのメソッドがあります。 all これらのメソッドを上書きせずにヘッダーを追加する方法はありますか?
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_to_response
メソッドを上書きする必要があります。
他のヒント
上書きレンダリングをレスポンス方法にしましたが、私はいくつかのビューにマッピングされたURL全体の塊を使用することができ、いくつかのビューで同じメソッドを上書きするために対処する必要はありませんでした。
私は Django-Corlsに基づいてミドルウェアクラスを作った。 -headers そのため、私のDjangoアプリの一部のIFRAMEを許可することができました。私はMiddleWare.pyをメインプロジェクトディレクトリに保存し、このようなランダムなミドルウェアクラスをここにあります。たとえば、Nofollow "> ForcereSesponse例外。
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のCORを有効にしたい場合は、e。 g。 / API / APIの下のREST APIの場合。 例:
CORS_URLS_REGEX = r'^/api/.*$'
.
デフォルト:
CORS_URLS_REGEX = '^.*$'
.