Flask + Pear Admin Layui 快速开发管理后台

框架介绍

Flask 就不用过多介绍了, Pear Admin Layui 是基于 Layui 的一套管理后台前端开源模板, 主打一个开箱即用, 对于不喜欢 React/Vue 等这些还需要大量学习成本的前端开发者来说, 可以说是相当友好了.
项目官网: https://gitee.com/pear-admin/pear-admin-layui
项目的作者其实也提供了 Flask 集成的项目 Pear Admin Flask, 其中包含了相当丰富的功能, 涵盖了用户, 权限, 角色, 日志等管理的场景, 如果是进行大型复杂项目开发, 可以考虑基于此项目直接二次开发. 不过对于一些小型的简单项目, 其实用不到这么复杂的功能, 反而是直接基于纯前端的模板自己用 Flask 搓更灵活.

本文假设你已经精通使用 Flask 开发 Hello World 应用的流程, 主要介绍基于 Pear Admin Layui 纯前端模板, 使用 Flask 实现模板所需的主要路由, 开发一个简单的博客管理后台的过程.

项目已在 Gitee 开源: https://gitee.com/lpwm/pear-blog

另外, 由于 Pear Admin 官网目前还没修好, 可以自行 Clone 官网的 仓库 (两年多没更新了, 后来新增的一些功能没有介绍), 或者访问:
临时官网文档
自建镜像站

项目准备

使用 uv 进行项目的管理. 如果你还没有体验过 uv 的强大, 快速入门见前文 使用 uv 管理 Python 项目

# 初始化项目
uv init pear-blog && cd pear-blog# 添加依赖 (会自动创建 .venv 文件夹)
uv add flask# 查看依赖树, 均是各个轮子最新的版本
uv tree -d 1
Resolved 17 packages in 1ms
pear-blog v0.1.0
└── flask v3.1.0# 初始化 Flask 文件夹结构
mkdir {templates,static,views}

此时项目的主体框架就准备好了, 把 uv 初始化的 main.py 改一下名字 app.py. 完成后的项目文件夹内张这样子:

./
├── .git/
├── .venv/
├── static/
├── templates/
├── views/
├── .gitignore
├── .python-version
├── LICENSE
├── README.md
├── app.py
├── pyproject.toml
└── uv.lock

接下来整合 Pear Admin Layui 模板, 首先下载压缩包, 本文使用版本为 4.0.5
https://gitee.com/pear-admin/pear-admin-layui/archive/refs/tags/4.0.5.zip

解压后将 admin/css, component, config 三个文件夹复制到 Flask 项目的 static 静态文件夹中. 删除 config/pear.config.json 我们后面使用 yml 格式的配置文件(能注释更方便). 完成后的 static 文件夹里面现在张这样:

static/
├── component/
│   ├── layui/
│   └── pear/
├── config/
│   └── pear.config.yml
└── css/├── admin.css├── admin.dark.css├── other/├── reset.css└── variables.css

至此, 项目基本准备工作已经就绪, 后面我们还会继续用到 Pear Admin Layui 解压后的 HTML 模板, 不过就是挑着来了, 用到哪个就复制到 Flask 项目的 templates 文件夹中.

Pear Admin 框架必备路由

鉴于你已经精通使用 Flask 开发 Hello World 应用的流程, 这里就不再赘述基础的 Flask 开发过程, 主要整理 Pear Admin 框架需要用到的几个路由需要返回的响应数据格式, 同时还需要注意调整前端框架中的配置文件以及 HTML 模板中对应资源的引用路径.

首先来看框架配置文件 /static/config/pear.config.yml, 需要修改下面几处设置:

## 网站配置
logo: ## 网站图标, 替换成静态文件对应的路径image: "/static/images/logo.png"
menu: ## 菜单数据, 替换为路由data: "/admin/menu"## 默认选中的菜单项select: "1"
## 视图内容配置
tab: ## 首页index: id: "1" ## 标识 ID , 建议与菜单项中的 ID 一致href: "/admin/home" ## 页面地址, 替换为路由title: "首页" ## 标题
header:## 站内消息,通过 false 设置关闭message: "/admin/message"

修改首页模板中对静态资源引用的路径:

<html>
<head><title>Pear Admin 4.0</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><link rel="stylesheet" href="{{ url_for('static', filename='component/pear/css/pear.css') }}" /><link rel="stylesheet" href="{{ url_for('static', filename='css/admin.css') }}" /><link rel="stylesheet" href="{{ url_for('static', filename='css/admin.dark.css') }}" /><link rel="stylesheet" href="{{ url_for('static', filename='css/variables.css') }}" /><link rel="stylesheet" href="{{ url_for('static', filename='css/reset.css') }}" />
</head><body><!-- 依 赖 脚 本 --><script src="{{ url_for('static', filename='component/layui/layui.js') }}"></script><script src="{{ url_for('static', filename='component/pear/pear.js') }}"></script><script>layui.use(['admin', 'jquery', 'popup'], function () {var admin = layui.admin;var popup = layui.popup;var $ = layui.jquery;// yml | json | apiadmin.setConfigurationPath("{{ url_for('static', filename='config/pear.config.yml') }}");</script>
</body>
</html>

创建一个单独的 Blueprint admin.py 用于为 Pear Admin 提供配置中所需的数据, 数据格式可以直接从 Pear Admin 解压后的 admin/data 文件夹中找到作为参考.

from flask import Blueprint, jsonify, render_templatebp = Blueprint("admin", __name__, url_prefix="/admin")@bp.get("/")
def index_get():return render_template("admin/index.html")@bp.get("/menu")
def menu_get():data = [{"id": 1,  # 菜单数据的唯一标识"title": "首页",  # 界面中所显示的菜单标题"icon": "layui-icon layui-icon-console",  # 显示图标"type": 1,  # 0=目录, 1=菜单"href": "/admin",  # 菜单类型下访问的页面},{"id": 2,"title": "文章管理","icon": "layui-icon layui-icon-list","type": 0,"children": [{"id": 21,"title": "添加文章","icon": "layui-icon layui-icon-addition","type": 1,"openType": "_iframe",  # 当 type 为 1 时,openType 生效,_iframe 正常打开 _blank 新建浏览器标签页"href": "/admin/article/add",},{"id": 22,"title": "数据分析","icon": "layui-icon layui-icon-console","type": 1,"openType": "_iframe","href": "/admin/article/analysis",},],},{"id": 3,"title": "外部链接","icon": "layui-icon layui-icon-chrome","type": 1,"openType": "_blank","href": "https://layui.dev",},]return jsonify(data)@bp.get("/message")
def message_get():data = {"code": 200,"data": [{"id": 1,"title": "通知","children": [{"id": 11,"avatar": "https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png","title": "你收到了 14 份新周报","context": "这是消息内容。","form": "就眠仪式","time": "刚刚",}],}],}return jsonify(data)@bp.get("/home")
def home_get():return "<h1>Home</h1>"@bp.get("/article/add")
def article_add_get():return "<h1>添加文章</h1>"@bp.get("/article/analysis")
def article_analysis_get():return "<h1>数据分析</h1>"

效果演示

至此, 一个基本的管理后台框架就搭建好了, 效果:

在这里插入图片描述
后续要做的就是在这个框架基础上创建具体的页面内容啦, 是不是 So easy! 😁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git push

在 git push 命令中&#xff0c;分支名称的顺序和含义非常重要。其基本格式如下&#xff1a; git push <remote> <local_branch>:<remote_branch>各部分解释 <remote>&#xff1a;远程仓库的名称&#xff08;如 origin&#xff09;。<local_branc…

wordpress 利用 All-in-One WP Migration全站转移

导出导入站点 在插件中查询 All-in-One WP Migration备份并导出全站数据 导入 注意事项&#xff1a; 1.导入部分限制50MB 宝塔解决方案&#xff0c;其他类似&#xff0c;修改php.ini配置文件即可 2. 全站转移需要修改域名 3. 大文件版本&#xff0c;大于1G的可以参考我的…

蓝桥杯补题

方法技巧&#xff1a; 1.进行循环暴力骗分&#xff0c;然后每一层的初始进行判断&#xff0c;如果已经不满足题意了&#xff0c;那么久直接continue&#xff0c;后面的循环就不用浪费时间了。我们可以把题目所给的等式&#xff0c;比如说有四个未知量&#xff0c;那么我们可以用…

MySQL:锁

按粒度分类 全局锁 含义&#xff1a;全局锁会锁定整个数据库实例&#xff0c;在其生效期间&#xff0c;其他事务无法对数据库进行任何读写操作。常用于数据迁移、数据备份场景。 表级锁 表锁&#xff1a;是对整张表进行锁定的机制。实现逻辑简单&#xff0c;加锁和释放锁速…

数字政府政务服务领域智能化应用解决方案

数字政府政务服务领域智能化应用 解决方案 一、方案背景 在数字经济蓬勃发展的当下&#xff0c;数字化转型已成为政府提升治理能力、优化公共服务、增强竞争力的关键路径。党的十九届四中全会明确提出 “推进数字政府建设”&#xff0c;这为政府的数字化转型指明了方向。 随…

03--Deepseek服务器部署与cjson解析

一、ollama部署deepseek模型 1、Ollama 是一个开源的本地大语言模型运行框架&#xff0c;专为在本地机器上便捷部署和运行大型语言模型&#xff08;LLM&#xff09;而设计。 Ollama 教程&#xff1a;从 0 到 1 全面指南 教程【全文两万字保姆级详细讲解】 -CSDN博客 1.下载o…

栈(算法)

在 C 里&#xff0c;栈是一种遵循后进先出&#xff08;LIFO&#xff09;原则的数据结构。下面从多个方面为你介绍 C 栈&#xff1a; 1. 使用标准库中的std::stack C 标准库提供了std::stack容器适配器&#xff0c;能方便地实现栈的功能。以下是简单示例&#xff1a; cpp #in…

UniApp 页面布局自定义头部导航

动态计算头部高度与内容偏移量&#xff1a;实现 UniApp 页面布局的精准适配 在移动端应用开发中&#xff0c;页面布局的精准适配是一个关键问题。尤其是在 UniApp 中&#xff0c;不同设备的屏幕尺寸、状态栏高度以及头部布局的差异&#xff0c;可能导致页面内容错位或显示不全…

verilog学习--1、语言要素

先看一个例子 /*This is first Verilog progaram*/ timescale 1ns/1ns module HalfAdder(A,B,Sum,Carry);input A,B;output Sum, Carry; /**/assign #2 SumA^B;assign #5 CarryA&B&#xff1b; endmodule; Verilog以module为单位编写&#xff0c;每个文件一个module&#…

AC 自动机 洛谷P3808 P3796 P5357

洛谷P3808 #include <bits/stdc.h> using namespace std; const int maxn 1e6 5; int ch[maxn][30], fa[maxn], End[maxn]; int cnt 0 , n; int get_num(char c){return c - a;} void build(string s){int cur 0, len s.length();for(int i 0; i < len; i){int…

C++蓝桥杯实训篇(二)

片头 嗨咯~小伙伴们&#xff01;今天我们来一起学习算法和贪心思维&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 第1题 数位排序 对于这道题&#xff0c;我们需要自己写一个排序算法&#xff0c;也就是自定义排序&#xff0c;按照数位从小到大进行排序。 举一…

redisson常用加锁方式

RLock lock redissonClient.getLock("lock:order:" order);和redissonDistributedLocker.tryLock("lock:order:" order&#xff0c; TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);这两种加锁方式的区别如下&…

Go 微服务框架 | 路由实现

文章目录 不用框架实现web接口实现简单的路由实现分组路由支持不同的请求方式支持同一个路径的不同请求方式前缀树应用前缀树完善路由代码 不用框架实现web接口 // blog main.go 文件 package mainimport ("fmt""log""net/http" )func main() {…

zabbix中通过模板实现自动发现对tcp端口批量监控

主要为了解决监控大量端口&#xff0c;避免繁琐的重复操作监控项和触发器 诸位~ 仅供参考哈 自动发现监控参考地址: https://blog.csdn.net/qq_37510195/article/details/130893655 模板 首先创建一个模板 自定义名称和群组 创建自动发现规则 模板——自动发现——创建发现规则…

Mysql备忘记录

1、简介 Mysql操作经常忘记命令&#xff0c;本文将持续记录Mysql一些常用操作。 2、常见问题 2.1、忘记密码 # 1、首先停止Mysql服务 systemctl stop mysqld # windows 从任务管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…

【蓝桥杯】15届JAVA研究生组F回文字符串

一、思路 1.这题去年考的时候想的是使用全排列进行尝试&#xff0c;实际不用这么麻烦&#xff0c;只用找到第一个和最后一个非特殊字符串的位置&#xff0c;然后分别向内检查是否对称&#xff0c;向外检查是否对称直到左指针小于0(可以通过添加使其对称) 2.至于如何找到第一个…

X 进制减法

题目链接&#xff1a; 思路&#xff1a; X进制数321怎么转换为十进制数为65&#xff1f;如下图&#xff1a; ①题目要求我们求 A - B 的最小值&#xff0c;对第 i 位&#xff0c;要求 A[i] - B[i] 的最小值&#xff0c;当进制越小的时候差值越小&#xff0c;但进制要比 max&…

java线程安全-单例模式-线程通信

首先看看单例模式的写法 首先我们先来回顾一下饿汉式单例模式&#xff1a; class Singleton{private static Singleton singletonnew Singleton();private Singleton(){}public static Singleton getInstrance(){return singleton;} } public class Test{public static void …

大数据技术之SPARK

Spark Core 什么是 RDD 代码中是一个抽象类&#xff0c;它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合 弹性 存储的弹性&#xff1a;内存与磁盘的自动切换&#xff1b; 容错的弹性&#xff1a;数据丢失可以自动恢复&#xff1b; 计算的弹性&#xff1a;…

Go 语言范围 (Range)

Go 语言范围 (Range) Go 语言是一种静态强类型、编译型、并发型编程语言&#xff0c;由 Google 开发。它的简洁性和高效性使其成为众多开发者的首选。在 Go 语言中&#xff0c;range 是一个非常有用的关键字&#xff0c;用于遍历数组、切片、字符串以及通道&#xff08;channe…