为什么在某些特定网址上会出现“AttributeError: 'unicode' 对象没有 'user' 属性”?

4 投票
2 回答
4592 浏览
提问于 2025-04-16 11:14

我从项目一开始就一直在用@login_required这个装饰器,它一直运行得很好。但最近,我在某些特定的链接上开始遇到一个错误:“AttributeError: 'unicode' object has no attribute 'user'”。这些链接以前是可以正常工作的。

举个例子:我已经登录到网站,然后点击一个链接,结果就出现了这个错误。这个错误通常和没有安装SessionMiddleware有关。但在我的情况下,已经安装了,因为我已经登录了,而且我所在的页面也有@login_required这个装饰器。

有人知道怎么回事吗?

这个链接的定义是:(r'^accept/(?P<token>[a-zA-Z0-9_-]+)?$', 'accept'), 方法是:@login_required def accept(request,token): ...

错误追踪信息:

Traceback (most recent call last):
  File "/Users/macbook/virtualenv/proj/lib/python2.6/site-packages/django/core/servers/basehttp.py", line 674, in __call__
    return self.application(environ, start_response)
  File "/Users/macbook/virtualenv/proj/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 241, in __call__
    response = self.get_response(request)
  File "/Users/macbook/virtualenv/proj/lib/python2.6/site-packages/django/core/handlers/base.py", line 141, in get_response
    return self.handle_uncaught_exception(request, resolver, sys.exc_info())
  File "/Users/macbook/virtualenv/proj/lib/python2.6/site-packages/django/core/handlers/base.py", line 165, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "/Users/macbook/virtualenv/proj/lib/python2.6/site-packages/django/core/handlers/base.py", line 100, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/Users/macbook/virtualenv/proj/lib/python2.6/site-packages/django/contrib/auth/decorators.py", line 25, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/Users/macbook/dev/pycharm-projects/proj/match/views.py", line 33, in accept
    return __process(token,callback)
  File "/Users/macbook/virtualenv/proj/lib/python2.6/site-packages/django/contrib/auth/decorators.py", line 24, in _wrapped_view
    if test_func(request.user):
AttributeError: 'unicode' object has no attribute 'user'`

2 个回答

0

如果你从另一个方法里调用了一个被装饰的方法,但没有提供请求参数,也可能会出现这种情况。

10

这个装饰器是在一个私有方法上,而这个方法并没有把请求作为参数。我把那个装饰器去掉了(当时因为重构和缺乏测试所以才留着,真是我不好)。

问题解决了。

撰写回答