Django利用中间间 判断页面是否登录,未登录则返回登录页

在t\login_app\middleware\ 新建 verify.py

python 复制代码
from django.shortcuts import redirect
from django.utils.deprecation import MiddlewareMixin

class VerifyMiddleware(MiddlewareMixin):
    def process_request(self, request):
        if request.path_info in ['/login/','/login/login/data/','/login/logout/']:
            return
        info_dict=request.session.get('info')
        if info_dict:
            request.user_id=info_dict['id']
            request.user_name=info_dict['username']
            request.user_role=info_dict['role']
            return
        else:
            return redirect("/login/")

在setting.py中注册

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",
    'login_app.middleware.verify.VerifyMiddleware',
]

views login.py

python 复制代码
import json

from django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
from django.views.decorators.csrf import csrf_exempt

from admin_app.models import UserInfo
from utils_app.utils.encryption import md5


# Create your views here.
def login(request):
    return render(request, "login/login.html")

@csrf_exempt
def login_data(request):
    username=json.loads(request.body)['username']
    password=json.loads(request.body)['password']
    password=md5(password)

    queryset=UserInfo.objects.filter(username=username,password=password).first()
    if queryset:
        request.session['info'] = {"id":queryset.id,"username":queryset.username,"role":queryset.role}
        request.session.set_expiry(60*60*24*7)           #保存时间7天
        return JsonResponse({'status':True})
    return JsonResponse({'status':False,'error':'用户名密码错误'})


def logout(request):
    request.session.clear()
    return redirect('/login')

登录前端页面login.html

html 复制代码
{% load static %}
<!DOCTYPE html>
<html lang="zh-CN" id="crm-html">
<head>
<meta charset="UTF-8" />
<title>登录 · 客户管理系统</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="{% static 'login/css/login.css' %}">
</head>

<body>

<div id="crm-login-box">
    <h1>客户管理系统</h1>
    <p>请输入账号和密码登录</p>

    <form onsubmit="return false;">
        <div class="crm-form-group">
            <label for="username">账号</label>
            <input
                type="text"
                id="username"
                class="crm-input"
                placeholder="请输入账号"
                autocomplete="username"
            />
        </div>

        <div class="crm-form-group">
            <label for="password">密码</label>
            <input
                type="password"
                id="password"
                class="crm-input"
                placeholder="请输入密码"
                autocomplete="current-password"
            />
        </div>

        <button class="crm-btn" id="btn_log">
            登 录
        </button>
    </form>

    <div id="crm-footer">
        © 备案号:xxxxx-xxxxx-xxxxx
    </div>
</div>

<script src="{% static 'bootstrap-3.4.1-dist/js/jquery-3.7.1.js' %}"></script>
<script>
    $('#btn_log').click(function () {

        $.ajax({
            url:'/login/login/data/',
            type:'post',
            data:JSON.stringify({
                username:$('#username').val(),
                password:$('#password').val(),
            }),
            dataType:"JSON",
            success:function(res){
                if(res.status){
                    window.location.href='/'
                }else{
                    alert(res.error)
                    location.reload()
                }
            }
        })
    })
</script>
</body>
</html>

登录后 前端 页可加上

html 复制代码
<div class="crm-user-dropdown">
                <button class="crm-user-btn" onclick="toggleDropdown()">
                    👤 {{ request.user_name }} ▾
                </button>
                <ul class="crm-dropdown-menu" id="crmDropdown">
                    <li><a href="#">👤 个人中心</a></li>
                    {% if request.user_role == 2 %}
                    <li><a href="/admin/">⚙️ 进入后台</a></li>
                    {% endif %}
                    <li><a href="/login/logout/">🚪 退出登录</a></li>
                </ul>
            </div>
相关推荐
言乐61 天前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame
小白勇闯网安圈1 天前
Django 响应对象、文件上传与类视图
数据库·django·sqlite
努力的小雨1 天前
同一份 SQL 跑多套环境:Ksql 变量怎么用才安全
数据库
科技绘图1 天前
快鲸GEO vs 传统AI搜索优化:全链路自动化与高效内容生产在转化闭环上的对比
数据库·人工智能·自动化
ltl1 天前
数据库作为 LLM 记忆体:语义缓存、RAG 与一致性
数据库
ltl1 天前
WAL 与崩溃恢复:ARIES 协议怎么跑通
数据库
ltl1 天前
TEE 数据库:EnclaveDB、Oblivious 原语与机密 SQL
数据库
麻瓜code1 天前
【Mysql】重新学一遍 SQL 执行顺序
数据库·sql
这个DBA有点耶1 天前
数据库一体机架构演进:从硬件堆叠到软硬深度耦合
服务器·网络·数据库·硬件架构·运维开发·database·数据库架构
安_1 天前
RAG的向量数据库:为LLM提供语义搜索能力
数据库