我有一个表单:
<form action="{% url "some_url" %}" method="post">
{% csrf_token %}
<input type="text">Text Input
<button type="submit">Submit</button>
</form>
通过 AJAX 提交的内容:
$(function () {
$('form').submit(function (e) {
e.preventDefault();
$.post($(this).attr('action'), $(this).serialize(), function (response) {
console.log(response);
});
});
});
该URL路由到此视图:
class SomeView(View):
def post(self, request, *args, **kwargs):
context = dict(**some_data)
rendered_html = render_to_string('some_template.html', context, RequestContext(self.request))
return JsonResponse(dict(html=rendered_html))
所有这些都有效。问题在于当CSRF令牌未发送时,它也可以正常工作,我收到了完全相同的成功响应:
$.post($(this).attr('action'), function (response) {
console.log(response);
});
我希望在缺少CSRF令牌时会出现某种错误。
显而易见的是:CsrfViewMiddleware
在MIDDLEWARE_CLASSES
中。
当没有发送令牌时,明确使用csrf_token
会产生相同的结果:
method_decorator(csrf_protect)
def dispatch(self, request, *args, **kwargs):
return super(SomeView, self).dispatch(request, *args, **kwargs)
我该如何强制执行它的验证?
MIDDLEWARE
设置?请确认django.middleware.csrf.CsrfViewMiddleware
是否已启用。https://docs.djangoproject.com/en/2.1/ref/csrf/#how-to-use-it - Håken LidMIDDLEWARE_CLASSES
中。有没有办法在运行时检查它是否确实处于活动状态,以确保它正在工作?(如果一开始它没有激活,我相信{% csrf_token %}
会输出一个空字符串,但我得到了一个实际的令牌。) - dabadabaCsrfViewMiddleware
允许响应之前,它还必须以表单数据或X-CsrfToken
标头的形式发送。如果您使用curl -X POST <url>
访问 URL,它是否仍然有效? - knbk