Django --CSRF令牌丢失或不正确

时间:2012-10-04 16:05:56

标签: python django

所以我得到了Forbidden(403)CSRF验证失败。请求中止。失败原因:CSRF令牌丢失或不正确 我的middleware_classes中有'django.middleware.csrf.CsrfViewMiddleware'。 这是我的模板

<form name="input" action="/login/" method="Post"> {% csrf_token %}
<input type="submit" value="Submit"></form>

这是我的观点

from django.shortcuts import render_to_response
from django.core.context_processors import csrf
from django.template import RequestContext
def login(request):
     csrfContext = RequestContext(request)
     return render_to_response('foo.html', csrfContext)

我是Django和大多数网络开发的新手,但我似乎无法在这里找到问题。任何帮助将不胜感激!

我也尝试过django文档中的方法

c = {}
c.update(csrf(request))
# ... view code here
return render_to_response("a_template.html", c)

6 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,我找到了解决问题的代码。

from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render
from django.contrib import auth

#in accounts.forms i've placed my login form with two fields, username and password
from accounts.forms import LoginForm

@csrf_exempt
def login(request):
   if request.method == "POST":
      form = LoginForm(request.POST)
      if form.is_valid():
         user = auth.authenticate(
                username=form.cleaned_data["username"],
                password=form.cleaned_data["password"])
                auth.login(request, user)
                return HttpResponseRedirect("/")
      else:
         form = LoginForm()

return render(request, 'accounts/login.html', {'form':form})

答案 1 :(得分:3)

尝试在登录功能之前添加@csrf_protect装饰器。

from django.views.decorators.csrf import csrf_protect

@csrf_protect
def login(request):
     csrfContext = RequestContext(request)
     return render_to_response('foo.html', csrfContext)

如果表单不在foo.html中,则需要将@csrf_protect方法添加到生成它的视图函数中。

答案 2 :(得分:0)

您应该执行以下操作:

def login(request):
     context = {}
     request_context = RequestContext(request)
     return render_to_response('foo.html', context,
                               request_context=request_context)

以下是render_to_response的{​​{3}}。

答案 3 :(得分:0)

只需将其添加到您的HTML中:

{% csrf_token %}

答案 4 :(得分:0)

转到URL并在视图方法/类旁边添加.as_view() 例如。

ObtainAuthTokenView.as_view()

答案 5 :(得分:0)

虽然禁用 CSRF 令牌并手动获取 CSRF 令牌值仍然有效。但是,在我的情况下,语法没有像 html 那样结构正确,我们不担心我们的脚本设计,但我认为在使用 jinja 时,即我们的模板语言很重要,是的,这就是我解决问题的方式。