2013-04-18 92 views
1

如何获取login()在会话中保存的用户对象?从会话中获取用户对象

user= request.session.get('user') 

返回nothingIn这个例子:

user = authenticate(username=username, password=password) 
if user is not None: 
    if user.is_active: 
     login(request, user) 
+0

请求= request.user可能? – ndpu

+0

请阅读有关django.contrib.auth.models.User对象 –

+0

您的第一个示例不是您如何获得用户。看看https://docs.djangoproject.com/en/1.2/topics/auth/#authentication-in-web-requests你做了Django提供的示例应用吗? –

回答

-1

AuthenticationMiddleware将用户属性,表示当前登录的用户,向每个传入HttpRequest对象。身份验证中间件需要安装会话中间件。所以,你应该settings.py中添加此中间件到MIDDLEWARE_CLASSES元组:

MIDDLEWARE_CLASSES = ( 
    #... 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    #... 
) 

顺便说一句,如果你想从那里这个中间件获取用户就知道了,看看AUTH中间件来源:

# contrib.auth.middleware.py: 

def get_user(request): 
    if not hasattr(request, '_cached_user'): 
     request._cached_user = auth.get_user(request) 
    return request._cached_user 

class AuthenticationMiddleware(object): 
    def process_request(self, request): 
     assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'." 

     request.user = SimpleLazyObject(lambda: get_user(request)) 


# django.contrib.auth.__init__.py (auth.get_user) 

def get_user(request): 
    from django.contrib.auth.models import AnonymousUser 
    try: 
     user_id = request.session[SESSION_KEY] 
     backend_path = request.session[BACKEND_SESSION_KEY] 
     backend = load_backend(backend_path) 
     user = backend.get_user(user_id) or AnonymousUser() 
    except KeyError: 
     user = AnonymousUser() 
    return user 

和默认backend.get_user:

# contrib.auth.backends.py 

def get_user(self, user_id):  
    try: 
     return User.objects.get(pk=user_id) 
    except User.DoesNotExist:  
     return None 
+0

谢谢。 request.user现在的作品:) – hln

2

请确保您有 'django.contrib.auth' 在你安装的应用程序 'django.contrib.contenttypes'。在需要之后运行syncdb。现在你将拥有你需要的所有用户表。

接下来你想确保你有request.user每个请求。我认为这就是为什么你没有得到任何request.user。 SessionMiddlewareAuthenticationMiddleware中间件需要位于MIDDLEWARE_CLASSES的设置中。

欲了解更多信息阅读文档here