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)

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

相关推荐
Alphapeople3 分钟前
路径规划算法的python实现
开发语言·python·算法
旋生万物9 分钟前
圈道裂痕——用 Python 验证素数分布的螺旋生成论判据
开发语言·python·数论·素数·cci·可计算数学
阿洛学长14 分钟前
Python笔记:dir() 和 help() 完整用法(适配Python二级 + IDLE实操)
服务器·笔记·python
Jialu.21 分钟前
第2篇:LLM 结构化输出实战:Pydantic + Function Calling 告别“解析 JSON 地狱“
python·langchain
江湖十年32 分钟前
Go 虚荣域名详解:我用 go get -x 抓了个包,终于看清了 Go 工具链“对暗号”的全过程
后端·面试·go
hanchenxing34 分钟前
本地AI绘画网关: 用 30 行 Python 把 NVIDIA FLUX.2 Klein 接入 OpenAI 兼容客户端Python
开发语言·python·ai作画·ai绘画·nvidia
Lost of 程序猿35 分钟前
船岸数据同步链路实战:SendFlag、单调版本号与断网三天后的续传
后端·c#·asp.net
Allen.Su37 分钟前
大模型 LoRA 微调全流程实战 - 车载问答全流程(跑通 + 参数详解 + 训练日志逐行解读 + 模型合并)
人工智能·python·lora·大模型微调
卷无止境38 分钟前
大模型如何调用工具,一次讲清背后的技术门道
后端·python
90后的晨仔1 小时前
Python 进阶:海象运算符与模式匹配,让你的代码更优雅!
后端