去管理员列表中,获取刚才登录的用户session:
用户发来请求,获取cookie随机字符串,拿着随机字符串,看看session中有没有
通过request.session.get("user_info")
来获取
def admin_list(request):# 获取当前登录用户信息info = request.session.get('user_info')print("info is...", info)# return HttpResponse("admin_list is ok")# 查询所有的数据queryset = models.Admin.objects.using("default").all()# 创建分页对象page_obj = Pagination(request, queryset)form = AdminModelForm()# context = {# "queryset": queryset,# "form": form# }context = {"form": form,"queryset": page_obj.page_queryset, # 分完页的数据"page_html": page_obj.html(), # 分页后的页码}return render(request, 'admin_list.html', context)
访问下管理员列表界面,看看输出的info是什么
可以看到session确实是被获取到了。
所以,如果用户没有登录,则返回登录界面,不给他直接进入部门列表界面或者管理员界面。
def admin_list(request):# 获取当前登录用户信息info = request.session.get('user_info')print("info is...", info)# 如果用户没有登录,则跳转到登录页面if not info:return redirect("/account/login/")# return HttpResponse("admin_list is ok")# 查询所有的数据queryset = models.Admin.objects.using("default").all()# 创建分页对象page_obj = Pagination(request, queryset)form = AdminModelForm()# context = {# "queryset": queryset,# "form": form# }context = {"form": form,"queryset": page_obj.page_queryset, # 分完页的数据"page_html": page_obj.html(), # 分页后的页码}return render(request, 'admin_list.html', context)
我们把cookie清除,看看能不能直接访问部门列表界面或者管理员列表界面
可以看到,当我们直接访问管理员列表,直接跳转登录界面。
类似的,如果有其他视图,则在所有的视图函数上,统一加上这个判断。
但是一个个加的话,贼烦。使用中间件来实现。
首先创建middleware文件夹,创建auth.py
from django.utils.deprecation import MiddlewareMixinclass AuthMiddlewareMixin(MiddlewareMixin):def process_request(self, request):print("MW 进来了")def process_response(self, request, response):print("MW 走了")return response
然后在settings注册
MIDDLEWARE = ["django.middleware.security.SecurityMiddleware","django.contrib.sessions.middleware.SessionMiddleware","django.middleware.common.CommonMiddleware","django.middleware.csrf.CsrfViewMiddleware","django.contrib.auth.middleware.AuthenticationMiddleware","django.contrib.messages.middleware.MessageMiddleware","django.middleware.clickjacking.XFrameOptionsMiddleware","app01.middleware.auth.AuthMiddlewareMixin",
]
修改业务逻辑
# 继承中间件类
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixinclass AuthMiddlewareMixin(MiddlewareMixin):def process_request(self, request):# 0 在做读取访问用户的session之前,要先过滤掉那么不需要登录就能访问的界面if request.path_info in ["/account/login/","/account/logout/",]:return None# 1 读取当前访问用户的session,如果能读取到,那么说明用户曾经登陆过,那么就可以继续往下执行;info_dict = request.session.get('user_info')if info_dict:return None# 2 如果没有读取到,则提示用户进行登录else:# return HttpResponse("请先登录")return redirect('/account/login/')def process_response(self, request, response):print("process_response。。。。")return response
把原来的获取信息注释掉
def admin_list(request):# # 获取当前登录用户信息# info = request.session.get('user_info')# print("info is...", info)# # 如果用户没有登录,则跳转到登录页面# if not info:# return redirect("/account/login/")# return HttpResponse("admin_list is ok")# 查询所有的数据queryset = models.Admin.objects.using("default").all()# 创建分页对象page_obj = Pagination(request, queryset)form = AdminModelForm()# context = {# "queryset": queryset,# "form": form# }context = {"form": form,"queryset": page_obj.page_queryset, # 分完页的数据"page_html": page_obj.html(), # 分页后的页码}return render(request, 'admin_list.html', context)
可以看到,当我们直接访问管理员列表,直接跳转登录界面。