我在django版本升级后无法登录

时间:2016-02-15 15:01:03

标签: django cookies login django-login django-upgrade

我尝试将旧代码从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中无效的原因。

1 个答案:

答案 0 :(得分:1)

从您的登录表单中删除Cookie测试,这是没有必要的。检查已从Django 1.7中的Django login formrelease notes)中删除。

您已启用CSRF保护,这已确保已启用Cookie。

不清楚为什么要定义自己的登录表单,而不是使用内置表单。使用您自己的表单意味着您遇到了这样的问题,并错过了confirm_login_allowed挂钩等新功能。