次のように、非常に単純なdjango TemplateViewがあります。
class Homeview(TemplateView):
template_name = 'home.html'
また、csrfmiddleware を有効にしていますが、そのホーム ビューに CSRF Cookie が設定されていないのはなぜですか? そのページの csrf Cookie に依存するフォームがあります。{% csrf_token %}
これを行うためにタグを使用したくありません。
これをデバッグしようとしましたが、 の条件に失敗したため、Cookie が設定されていないことがわかりました。CSRF_COOKIE_USED
この変数は私のrequest.META
.
def process_response(self, request, response):
if getattr(response, 'csrf_processing_done', False):
return response
# If CSRF_COOKIE is unset, then CsrfViewMiddleware.process_view was
# never called, probaby because a request middleware returned a response
# (for example, contrib.auth redirecting to a login page).
if request.META.get("CSRF_COOKIE") is None:
return response
if not request.META.get("CSRF_COOKIE_USED", False):
return response # **It returned here, so COOKIE is never set!**
# Set the CSRF cookie even if it's already set, so we renew
# the expiry timer.
response.set_cookie(settings.CSRF_COOKIE_NAME,
request.META["CSRF_COOKIE"],
max_age = 60 * 60 * 24 * 7 * 52,
domain=settings.CSRF_COOKIE_DOMAIN,
path=settings.CSRF_COOKIE_PATH,
secure=settings.CSRF_COOKIE_SECURE
)
# Content varies with the CSRF cookie, so set the Vary header.
patch_vary_headers(response, ('Cookie',))
response.csrf_processing_done = True
return response
コンテキスト プロセッサの設定を追加します。
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.static',
'django.core.context_processors.tz',
'django.core.context_processors.csrf',
'django.core.context_processors.request',
'django.contrib.messages.context_processors.messages',
)
また、非常に奇妙なものを見つけました:
テンプレートに {% csrf_token %} が存在する場合、csrf_cookie が存在します。