我尝试将旧代码从django 1.5升级到1.8以用于客户端。项目使用django.contrib.auth.views.login
来验证登录。 urls.py
看起来如下:
urlpatterns = patterns('',
url(r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'accounts/login.html', 'authentication_form': LoginForm}, name="login"),
url(r'^accounts/logout/$', 'django.contrib.auth.views.logout', {'template_name': 'accounts/logged_out.html'}, name="logout"),
)
以下是LoginForm
类:
class LoginForm(forms.Form):
username = forms.CharField(label=_("Username"), max_length=120)
password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
def __init__(self, request=None, *args, **kwargs):
self.request = request
self.user_cache = None
super(LoginForm, self).__init__(*args, **kwargs)
def clean(self):
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password')
if self.request:
if not self.request.session.test_cookie_worked():
raise forms.ValidationError(_("Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."))
return self.cleaned_data
以下是中间件列表:
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
'apps.facebook.middleware.FacebookMiddleware',
)
升级之前我能够登录,但升级后我无法登录。我收到了以下非字段错误:
您的网络浏览器似乎没有启用Cookie。登录需要使用Cookie。
如果我降级到django 1.5,我可以再次登录。如何解决问题以及登录在django 1.8中无效的原因。
答案 0 :(得分:1)
从您的登录表单中删除Cookie测试,这是没有必要的。检查已从Django 1.7中的Django login form(release notes)中删除。
您已启用CSRF保护,这已确保已启用Cookie。
不清楚为什么要定义自己的登录表单,而不是使用内置表单。使用您自己的表单意味着您遇到了这样的问题,并错过了confirm_login_allowed
挂钩等新功能。