13 django管理系统 - 注册与登录 - 中间件控制访问

去管理员列表中,获取刚才登录的用户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)

可以看到,当我们直接访问管理员列表,直接跳转登录界面。

相关推荐
苏三说技术16 分钟前
Java泛型符号T、E、K、V、? 傻傻分不清楚
后端
被放养的研究生37 分钟前
dir()与help()
python
我的xiaodoujiao1 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 20--PO(POM) 设计模式和用例撰写
python·学习·测试工具·设计模式·pytest
子不语1801 小时前
深度学习(一)——基础知识:Python语言/解释器/环境/编辑器
python·学习
绝无仅有1 小时前
猿辅导面试系列:MQ消息队列解析与常见面试问题
后端·面试·github
绝无仅有1 小时前
猿辅导计算机面试文章经典总结
后端·面试·github
爱学习的爬虫1 小时前
Python实现Jenkins实现自动化执行Job
python·自动化·jenkins
IT_陈寒1 小时前
Redis性能优化的7个隐藏技巧:从慢查询到亿级QPS的实战经验分享
前端·人工智能·后端
一晌小贪欢2 小时前
Python爬虫第9课:验证码识别与自动化处理
爬虫·python·自动化·网络爬虫·python爬虫·python3
bin91532 小时前
AI工具赋能Python开发者:项目开发中的创意守护与效率革命
开发语言·人工智能·python·工具·ai工具