2012-10-04 71 views
3

所以我正在故宫(403)CSRF验证失败。请求中止。给出失败的原因:CSRF令牌丢失或不正确。
我在我的middleware_classes中有'django.middleware.csrf.CsrfViewMiddleware'。 这里是我的模板Django的--CSRF令牌丢失或不正确

<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和大多数Web开发,但我似乎无法在这里找到问题。任何帮助将非常感激!

此外,我已经尝试了Django文档

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

只是一个方面说明:如果你是新来的Django,我会考虑使用基于类的视图几乎所有东西。即使你只是重写'post',他们至少也会强制服务器将响应哪个HTTP请求类型。 – Arion

+0

什么样的模板/视图是在

中创建的? –

+0

您需要在模板中添加'{%csrf_token%}'。并确保'RequestContext'存在..当然,'settings.py'中的相应中间件以及..如果问题仍然存在。我不确定但是..尝试一些'@ csrf_exempt'装饰器..等 – Surya

回答

2

尝试只登录功能之前添加@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方法添加到正在生成它的视图功能。

+0

尝试了它,仍然得到相同的错误,也尝试了上面的建议,修复了render_to_response语法... – daabears

+0

问题可能是您要发布到/ login /从另一个页面,而另一个页面没有@ csrf_protect吗?评论中的模板文字是从哪个页面开始的?查看正在生成的HTML并验证它是否包含csrf_protect标记。 –

+0

啊,就是这样,非常感谢! – daabears

0

的方法,您应该做到以下几点:

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

这里是official docsrender_to_response

+0

仍然收到相同的错误,我也尝试使用@csrf_protect装饰器没有改善... – daabears

+0

在你的HTML,你看到的CSRF标记?如果不是,请尝试添加'requires_csrf_token'装饰器。 – miki725

2

我有同样的问题,你和我发现这个代码,解决我的问题。

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

添加csrf_exempt不应该是必需的,并使您的网站易受攻击。该装饰器适用于您特别需要这些请求的边缘案例,了解其风险并采取了其他预防措施。 – Andre

相关问题