Django:POST表单需要CSRF吗? GET没有?

时间:2010-08-25 21:17:51

标签: django views django-csrf

使用POST方法的表单是否需要具有CSRF保护?我正在关注一本书,代码示例会抛出403错误。我做了一些搜索,似乎我需要在所有表单中启用CSRF。

我的问题是:

  1. Django现在是否要求保护所有POST表单免受CSRF的侵害?

  2. 我需要做的就是添加'django.middleware.csrf.CsrfViewMiddleware',返回render_to_response(模板,字典,context_instance = RequestContext(请求),并添加'{%csrf_token%}'in相应的表格?我在这里遗漏了什么吗?

  3. 当我这样做时,表单工作正常。当缺少任何这些部分时,它就失败了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时才会调用它。这对我来说似乎完全错了。在进行POST时我不应该调用“context_instance = RequestContext(request)”吗?

1 个答案:

答案 0 :(得分:8)

POST应该用于敏感信息,例如密码,而django需要用csrf_token保护它; GET应该用于不需要保护的可收藏的内容,例如搜索。你这样做了。

修改

context_instance=RequestContext(request)执行POST时,您不应该调用POST,无论请求类型如何,都应该调用它。看看它是这样的:

  • GET吗?这意味着表单已提交。我们验证表单,如果表单正常,则将用户重定向到另一个页面,或者再次向用户显示表单,错误
  • 是{{1}}吗?这意味着表单没有提交,但其他的东西正在发生,我们不关心(一些推荐链接或其他东西)。 无论如何显示表格

斜体的操作由最后一次返回完成,无论if。