去管理员列表中,获取刚才登录的用户session:
用户发来请求,获取cookie随机字符串,拿着随机字符串,看看session中有没有
通过request.session.get("user_info")
来获取
python
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确实是被获取到了。
所以,如果用户没有登录,则返回登录界面,不给他直接进入部门列表界面或者管理员界面。
python
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
python
from django.utils.deprecation import MiddlewareMixin
class AuthMiddlewareMixin(MiddlewareMixin):
def process_request(self, request):
print("MW 进来了")
def process_response(self, request, response):
print("MW 走了")
return response
然后在settings注册
python
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",
]
修改业务逻辑
python
# 继承中间件类
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin
class 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
把原来的获取信息注释掉
python
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)
可以看到,当我们直接访问管理员列表,直接跳转登录界面。