使用POST方法的表单是否需要CSRF保护?我正在看一本书,其中的代码示例会抛出403错误。我做了一些搜索,似乎我需要启用CSRF在我的所有形式。
我的问题是:
- Django现在是否要求所有POST表单都受到CSRF的保护?
1.我需要做的就是添加django.middleware.csrf.CsrfViewMiddleware
,返回render_to_response(template,dictionary, context_instance=RequestContext(request)
,然后以相应的形式添加{% csrf_token %}
。我错过什么了吗?
当我这样做时,表单工作得很好。当这些块中的任何一个丢失时,它将失败到403。我只是想确保我做得对。:)
先谢谢你了。
编辑:
由于某些原因,这段代码对我来说没有意义,但它没有返回任何错误。请忽略原始验证,因为我还没有看到本书中展示更有效方法的部分。
def contact(request):
errors = []
if request.method == 'POST':
if not request.POST.get('subject', ''):
errors.append('Enter a subject')
if not request.POST.get('message', ''):
errors.append('Enter a message')
if request.POST.get('email', '') and '@' not in request.POST['email']:
errors.append('Enter a valid email address')
if not errors:
send_mail(
request.POST['subject'],
request.POST['message'],
request.POST.get('email', 'noreply@example.com'),
['siteownder@example.com'],
)
return HttpResponseRedirect('/contact/thanks/')
return render_to_response(
'contact_form.html',
{'errors': errors},
context_instance=RequestContext(request),
)
我的问题是这个视图函数的最后一行。只有当request.method != 'POST'
时才调用它。我觉得这完全不对。我不应该在context_instance=RequestContext(request)
进行POST时调用它吗?
1条答案
按热度按时间pw9qyyiw1#
POST应该用于敏感信息,比如密码,django需要用csrf_token来保护它; GET应该用于不需要保护的可标记内容,比如搜索。你做得对。
编辑
你不应该在
context_instance=RequestContext(request)
执行POST
时调用它,你应该不管请求类型如何都调用它。你这样看:POST
吗?这意味着表单已提交。我们验证表单,如果表单正常,则将用户重定向到另一个页面,或者show the form again to the user, with the errors
。GET
吗?这意味着表单没有被提交,但其他的事情正在发生,我们不关心(一些引用链接或其他东西)。Show the form anyway
斜体显示的操作由最后一次返回完成,与if无关。