0

次のように、非常に単純なdjango TemplateViewがあります。

class Homeview(TemplateView):
    template_name = 'home.html'

また、csrfmiddleware を有効にしていますが、そのホーム ビューに CSRF Coo​​kie が設定されていないのはなぜですか? そのページの 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 が存在します。

4

1 に答える 1

1

1.4 を使用している場合は を使用します。ensure_csrf_cookieそれ以外の場合は、このJavaScript スニペットを使用します。

于 2012-12-09T13:29:18.940 に答える