<p>在基于类的视图中,默认的<a href="https://docs.djangoproject.com/en/1.5/ref/class-based-views/base/#django.views.generic.base.View.dispatch" rel="nofollow">dispatch</a>方法尝试委托给与HTTP方法相对应的方法。</p>
<p><a href="https://github.com/django/django/blob/master/django/views/generic/base.py#L147" rel="nofollow">^{<cd1>}</a>只实现一个<code>get()</code>方法,因此它只适用于GET请求。当您使用<code>POST</code>请求登录时,dispatch方法查找<code>TemplateView.post()</code>方法。因为这不存在,它返回一个HTTP错误405(不允许使用方法)。</p>
<p>在中间件中,我建议您在成功登录后重定向到同一个url。一般来说,这个<a href="https://github.com/django/django/blob/master/django/views/generic/base.py#L147" rel="nofollow">Post/Redirect/Get</a>模式是一个很好的建议。浏览器将遵循重定向,并使用GET请求获取<code>IndexView</code>,这将成功。</p>
<pre><code>if form.is_valid():
# log the user in
from django.contrib.auth import login
login(request, form.get_user())
# if this is the logout page, then redirect to /
# so we don't get logged out just after logging in
if reverse('logout') in request.get_full_path():
return HttpResponseRedirect('/')
# redirect to the same url after a successful POST request.
return HttpResponseRedirect('')
</code></pre>
<p>最后,浏览器可能会显示一个空白页,但是还有更多的信息可以用于调试。Django dev服务器将显示它返回了405错误代码。使用浏览器的开发人员工具栏,它应该显示错误代码<code>405 METHOD NOT ALLOWED</code>的描述,以及<code>Allow:get, head</code>报头,它告诉你视图不允许post请求。</p>