成功登录后如何向Django的响应上下文添加内容?

时间:2013-02-05 14:12:26

标签: django authentication

我有一个Django项目,其中我目前有一个标准登录视图的包装器:

from django.contrib.auth import views as auth_views
from myapp.forms import LoginForm

def login(request, *args, **kwargs):
    """Wrapper for auth.login."""
    kwargs['template_name'] = 'login.html'
    kwargs['authentication_form'] = LoginForm
    auth_view_response = auth_views.login(request, *args, **kwargs)
    return auth_view_response

这一切都运行正常,但我想在下一页的响应上下文中添加一些东西,只有登录成功。我不确定如何:

  1. 检查用户是否在调用auth_views.login()后成功登录,或
  2. 添加一个将显示在下一页上下文中的变量。

2 个答案:

答案 0 :(得分:1)

谈到第一个问题:

  

在调用auth_views.login()或

之后,检查用户是否已成功登录

在视图功能中查看request.user.is_authenticated()

说到第二个问题,你可以在用户会话中添加变量,然后在下一页上检查它:

#in the view mentioned above    
if request.user.is_authenticated():
    request.session['some_key'] = "some_var"

#in the view, that represents the next page
foo = request.session.get('some_key',None)
#now you can add foo to template context

答案 1 :(得分:1)

通常情况下,我在发布SO问题后不久就提出了答案。

我不需要对登录视图做任何事情。相反,我使用user_logged_in信号:

from django.contrib.auth.signals import user_logged_in

def post_login_actions(sender, user, request, **kwargs):
        request.session['just_logged_in'] = True

user_logged_in.connect(post_login_actions, dispatch_uid="user_logged_in")

(我把它放在myapp/models/userprofile.py的末尾。)

然后我有myapp/context_processors.py这样:

from django.conf import settings

def membership_context(request):
    context = {
        'just_logged_in': request.session.get('just_logged_in', False),
    }
    # Now we've used any True setting for this, set it to False subsequent requests:
    request.session['just_logged_in'] = False
    return context

当然,请在我的设置中添加TEMPLATE_CONTEXT_PROCESSORS

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS += (
    'myapp.context_processors.membership_context',
)

现在,每个模板在其上下文中都有一个just_logged_in值,通常为False,但在用户登录后在第一个页面视图中为True。

相关问题