如何在Django内置登录视图中添加会话变量及模板使用方法
解决Django 1.11内置登录视图中设置会话变量的问题
针对你遇到的问题,有两种比较优雅的方案可以在用户登录时设置会话变量,无需额外重定向;同时模板里是可以直接使用会话变量的,下面详细说明:
方案一:利用Django登录信号设置会话变量
Django内置了user_logged_in信号,会在用户成功登录后自动触发,我们可以编写一个信号接收器来处理会话变量的设置,这是最简洁的方式,不需要修改原有登录视图的逻辑。
- 在你的app目录下创建
signals.py文件,添加以下代码:
from django.contrib.auth.signals import user_logged_in from django.dispatch import receiver @receiver(user_logged_in) def set_session_variables_on_login(sender, request, user, **kwargs): # 设置你需要的会话变量,示例如下 request.session['user_full_name'] = user.get_full_name() request.session['user_role'] = 'admin' if user.is_superuser else 'regular' # 可以添加更多自定义变量
- 注册信号接收器:
在app的apps.py文件中,修改ready方法(如果没有就添加):
from django.apps import AppConfig class YourAppConfig(AppConfig): name = 'your_app_name' def ready(self): import your_app_name.signals # 导入信号模块
然后在项目的settings.py中,确保你的app是以这种配置类的方式注册的:
INSTALLED_APPS = [ # ... 'your_app_name.apps.YourAppConfig', # ... ]
这样用户每次登录成功后,会话变量就会自动被设置,完全不需要修改原有的登录视图逻辑。
方案二:自定义登录视图继承内置视图
如果你更倾向于直接控制登录流程,可以继承Django内置的登录视图,重写验证成功后的逻辑来添加会话变量。
基于类的视图(Django 1.11支持)
from django.contrib.auth.views import LoginView class CustomLoginView(LoginView): def form_valid(self, form): # 先调用父类的form_valid完成登录逻辑 response = super(CustomLoginView, self).form_valid(form) # 现在设置会话变量 user = self.request.user self.request.session['user_full_name'] = user.get_full_name() self.request.session['user_role'] = 'admin' if user.is_superuser else 'regular' return response
然后在urls.py中替换原有的登录路由:
from django.conf.urls import url from your_app_name.views import CustomLoginView urlpatterns = [ # ... url(r'^login/$', CustomLoginView.as_view(template_name='registration/login.html'), name='login'), # ... ]
基于函数的视图(如果习惯使用函数式视图)
from django.contrib.auth import login as auth_login from django.contrib.auth.forms import AuthenticationForm from django.shortcuts import render, redirect def custom_login(request): if request.method == 'POST': form = AuthenticationForm(request, data=request.POST) if form.is_valid(): user = form.get_user() auth_login(request, user) # 设置会话变量 request.session['user_full_name'] = user.get_full_name() request.session['user_role'] = 'admin' if user.is_superuser else 'regular' # 重定向到登录后的页面,默认是settings.LOGIN_REDIRECT_URL return redirect(request.GET.get('next', '/')) else: form = AuthenticationForm(request) return render(request, 'registration/login.html', {'form': form})
同样在urls.py中替换路由即可。
模板中使用会话变量
当然可以在模板中直接使用会话变量!你只需要确保模板上下文包含request对象。在Django 1.11中,默认的模板上下文处理器已经包含了django.core.context_processors.request(在settings.py的TEMPLATE_CONTEXT_PROCESSORS里),所以你可以直接在模板中这样写:
<p>欢迎您,{{ request.session.user_full_name }}!</p> <p>您的角色是:{{ request.session.user_role }}</p>
如果发现模板里无法访问request,可以检查settings.py中的配置:
TEMPLATES = [ { # ... 'OPTIONS': { 'context_processors': [ # ... 'django.core.context_processors.request', # ... ], }, }, ]
这样就能在模板中轻松获取你设置的会话变量了。
内容的提问来源于stack exchange,提问作者Talha Ahmed
相关产品推荐
相关产品推荐

