django auth:authenticate() 的奇怪错误

1 投票
2 回答
708 浏览
提问于 2025-04-15 23:41

我正在使用authenticate()手动验证用户。
在管理界面中,我发现用户没有'last_login'这个属性。

调试信息如下:

Environment:

Request Method: GET
Request URL: https://localhost/login/
Django Version: 1.1.1
Python Version: 2.6.5
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.admin',
 'mobius.polls']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware')


Traceback:
File "/usr/lib/pymodules/python2.6/django/core/handlers/base.py" in get_response
  92.                 response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/pymodules/python2.6/django/contrib/auth/__init__.py" in login
  55.     user.last_login = datetime.datetime.now()

Exception Type: AttributeError at /login/
Exception Value: 'unicode' object has no attribute 'last_login'

我搞不明白,为什么会出现这样的差异。
任何帮助都非常感谢!提前谢谢!

2 个回答

0

这个错误信息告诉你:“user”是一个unicode对象,而不是django.contrib.auth.models.User对象。你确定数据库是可以访问的吗?可以试试:

python manage.py shell
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(pk=1)
>>> u.last_login

这段代码应该能正常工作。如果不行,那可能是你的数据库设置有问题。(也许你没有执行 python manage.py syncdb 呢?)

请把settings.py中和数据库相关的部分也发出来。从你现在提供的信息来看,很难找到问题的原因。

完整的错误追踪信息也很有帮助。

2

问题不在于 authenticate(),而是出在 login() 上。你似乎把一个 unicode 字符串传给了它,而不是一个 django.contrib.auth.models.User 对象。

你应该从 authenticate() 中获取那个 User 对象。

user = authenticate(username=username, password=password)
...
login(request, user)

关于 authenticate 和 login 的文档

撰写回答