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)

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

相关推荐
八九燕来8 分钟前
Django双下划线查询
数据库·django·sqlite
德育处主任25 分钟前
在亚马逊云上,如何基于 VPC IPAM 的 ALB 公网 IP 预测分配?
后端
ahead~34 分钟前
【大模型入门】访问GPT_API实战案例
人工智能·python·gpt·大语言模型llm
不吃肉的羊37 分钟前
PHP设置文件上传最大值
后端·php
专注物联网全栈开发40 分钟前
ESP32的IRAM用完了怎么优化
后端
雨落倾城夏未凉40 分钟前
7.QObject定时器和QTimer定时器的区别
后端·qt
洗澡水加冰43 分钟前
RAG系统工程化
后端·aigc
paopaokaka_luck1 小时前
智能推荐社交分享小程序(websocket即时通讯、协同过滤算法、时间衰减因子模型、热度得分算法)
数据库·vue.js·spring boot·后端·websocket·小程序
大模型真好玩1 小时前
准确率飙升!GraphRAG如何利用知识图谱提升RAG答案质量(额外篇)——大规模文本数据下GraphRAG实战
人工智能·python·mcp
19891 小时前
【零基础学AI】第30讲:生成对抗网络(GAN)实战 - 手写数字生成
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·近邻算法