これは数年遅れていますが、最近この問題を回避した方法を次に示します。
トリックは、ワニスがサポートするESIを使用することです。CSRF スニペットを取得し、ワニスを通過するときは ESI 経由で含め、それ以外の場合 (ローカル開発サーバーを実行するときなど) は直接、それを独自のページに貼り付けます。
csrf_esi.html:
{% csrf_token %}
csrf_token.html
{% if request.META.HTTP_X_VARNISH_USE_CACHE %}
<esi:include src="{% url 'esi_csrf_token' %}" />
{% else %}
{% include "csrf_esi.html" %}
{% endif %}
urls.py
from django.conf.urls import url
from django.views.generic import TemplateView
urlpatterns = [
...
url(r'csrf_esi.html', TemplateView.as_view(template_name="csrf_esi.html"), name='esi_csrf_token'),
]
csrf_esi.py
from django import template
register = template.Library()
@register.inclusion_tag('csrf_token.html', takes_context=True)
def csrf_token_esi(context):
return context
設定.py
TEMPLATES = [
{
...
'OPTIONS': {
...
'builtins': [
'path.to.csrf_esi',
],
}
}
]
ワニス構成
set req.http.X-Varnish-Use-Cache = true;
csrf_esi.html
また、キャッシュされないようにページをホワイトリストに登録しset beresp.do_esi = true;
、関数内に追加する必要がありvcl_fetch
ます。これについてもっと詳しく説明したいと思いますが、システムのこの部分を設定したわけではなく、100% 明確ではありません。
{% csrf_token %}
これで、通常のタグと同じように簡単に使用できます。
<form action="">
{% csrf_token_esi %}
<button type="submit">Push me</button>
</form>
セットアップにはかなりの手間がかかりますが、一度セットアップすれば、二度と見る必要はありません。