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)

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

相关推荐
我爱娃哈哈5 分钟前
SpringBoot + Redis Stream + 消费组:替代 Kafka 轻量级消息队列,低延迟高吞吐
后端
程序员大飞哥6 分钟前
MPTCP 协议全景:从 RFC 6824 到 RFC 8684 的演进
后端
程序员大飞哥6 分钟前
MPTCP 握手全解剖:一条连接是如何"长出"多条腿的
后端
凛訫訫8 分钟前
Java基础--面向对象高级(2)
后端
悟空码字11 分钟前
滑块拼图验证:SpringBoot完整实现+轨迹验证+Redis分布式方案
java·spring boot·后端
Nyarlathotep011312 分钟前
对象头、Monitor与synchronized
后端
大连好光景17 分钟前
conda管理包还是pip管理包
python·conda·pip
m0_7301151122 分钟前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
luffy545927 分钟前
Rust语言入门-变量篇
开发语言·后端·rust
FreakStudio30 分钟前
MicroPython+PycoClaw,3 分钟搞定 ESP32 跑上 OpenClaw!
python·单片机·嵌入式·电子diy