为什么我的POST表单中出现csrf错误? (django的/蟒)

时间:2013-11-02 21:22:22

标签: python django

views.py

from django.shortcuts import render_to_response
from django.core.context_processors import csrf
def home(request):  
    c = {}
    c.update(csrf(request))
    if request.method == "POST":
        username = request.POST.get("username", '') 
        password = request.POST.get("password", '') 
        return render_to_response("login_home.html", {"username":username, "password":password})
    else:
        return render_to_response("login_home.html")

login_home.html

{% extends "base.html" %}
{% block page %}
    {{ name }}
    <form action = "/blog/home/" method = "POST">{% csrf_token %}
    <input type = "text" name = "username" placeholder = "username">
    <input type = "text" name = "password" placeholder = "password">
    <input type = "submit">
    </form>

    {{ username }}
    {{ password }}

{% endblock %}

urls.py

from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
    url(r'^home/$', 'blog.views.home'),
)

^^这是我的档案。问题是我提交表格后得到的错误:

Forbidden (403)
CSRF verification failed. Request aborted.

我不确定我忘记或遗失的是什么。我猜它在视图功能的某个地方。有人能指出我失踪了吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您需要使用RequestContext或使用c.update(csrf(request))返回您创建的上下文:

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

  
      
  1. 使用RequestContext,它始终使用'django.core.context_processors.csrf'(无论您的TEMPLATE_CONTEXT_PROCESSORS设置如何)。如果您使用的是通用视图或contrib应用程序,则您已经被覆盖,因为这些应用程序始终使用RequestContext。

  2.   
  3. 手动导入并使用处理器生成CSRF令牌并将其添加到模板上下文中。 e.g ....

  4.   
return render_to_response("login_home.html",
    {"username":username, "password":password}
    context_instance=RequestContext(request))