当前位置: 首页 > news >正文

基于pear-admin-flask 的 flask 使用教程

我最近接触到了一个极为出色的Flask后台库——pear-admin-flask,这个库具有很高的二次开发价值。借此机会学习并吸收其中Flask开发的一些高级技巧。

1. flask 自定义命令 @ pear-admin-flask/applications/common/script/admin.py

from flask.cli import AppGroup # 导入库
admin_cli = AppGroup("admin") # 定义子命令 admin
...@admin_cli.command("init") # 定义子命令操作 init
def init_db(): # 函数db.session.add_all(userdata)...

命令行调用

flask admin init

2. 权限管理

a. 数据库定义权限 @ pear-admin-flask/applications/common/script/admin.py

# 作者提供了非常有效的权限管理过程
powerdata = [Power(id=1,name='系统管理',type='0',code='',url=None,open_type=None,parent_id='0',icon='layui-icon layui-icon-set-fill',sort=1,create_time=now_time,enable=1,),...
]

b. 定义权限拦截函数 @ pear-admin-flask/applications/common/utils/rights.py

def authorize(power: str, log: bool = False):"""用户权限判断,用于判断目前会话用户是否拥有访问权限:param power: 权限标识:type power: str:param log: 是否记录日志, defaults to False:type log: bool, optional"""def decorator(func):@login_required@wraps(func)def wrapper(*args, **kwargs):# 定义管理员的id为1if current_user.username == current_app.config.get("SUPERADMIN"):return func(*args, **kwargs)if not power in session.get('permissions'):if log:admin_log(request=request, is_access=False)if request.method == 'GET':abort(403)else:return jsonify(success=False, msg="权限不足!")if log:admin_log(request=request, is_access=True)return func(*args, **kwargs)return wrapperreturn decorator

c. 加载权限 @ pear-admin-flask/applications/view/system/passport.py

session['permissions'] = user_power

d. 使用过程 @ 多个文件中都有使用, 例如: pear-admin-flask/applications/view/system/dept.py


@bp.get('/')
@authorize("system:dept:main", log=True)
def main():return render_template('system/dept/main.html')

3. Blueprint 的使用, 这个我在另外一个项目中也用过, 可以将 flask 接口分到多个文件实现. @ pear-admin-flask/applications/view/system/dept.py

# 导入 Blueprint
from flask import Blueprint, render_template, request, jsonify
# 初始化
bp = Blueprint('dept', __name__, url_prefix='/dept')
# 使用修饰器实现接口
@bp.get('/')
@authorize("system:dept:main", log=True)
def main():return render_template('system/dept/main.html')

然后 统一初始化 api. @ /pear-admin-flask/applications/view/system/__init__.py

from flask import Flask, Blueprintfrom applications.view.system.dict import bp as dict_bp
...system_bp = Blueprint('system', __name__, url_prefix='/system')def register_system_bps(app: Flask):# 在admin_bp下注册子蓝图system_bp.register_blueprint(user_bp)...

接下来就可以通过浏览器 GET http://ip:port/system/dept 访问到 pear-admin-flask/applications/view/system/dept.py 中接口函数.

4. flask_login 登陆管理,

a. 定义用户登陆函数 @ pear-admin-flask/applications/extensions/init_login.py

    @login_manager.user_loaderdef load_user(user_id):from applications.models import Useruser = User.query.get(int(user_id))return user

b. 登陆登出 @pear-admin-flask/applications/view/system/passport.py

from flask_login import current_user, login_user, login_required, logout_user# 登录
@bp.post('/login')
def login_post():...login_user(user, remember=remember)...
# 登出
@bp.post('/logout')
@login_required
def logout():logout_user()session.pop('permissions')return success_api(msg="注销成功")

c. 会话管理, 验证是否登陆,没有登陆就禁止访问, @pear-admin-flask/applications/common/utils/rights.py


from flask_login import login_required, current_user@login_required  # 登陆许可修饰器
@wraps(func)
def wrapper(*args, **kwargs):

5. flask_uploads 用于管理文件上传操作, @ pear-admin-flask/applications/extensions/init_upload.py

# 导入
from flask_uploads import UploadSet, IMAGES
# 定义集合与路径
photos = UploadSet('photos', IMAGES)def init_upload(app: Flask):# 关联 appconfigure_uploads(app, photos)

使用 photos 在上传接口接收文件 @ pear-admin-flask/applications/view/system/file.py

#   上传接口
@bp.post('/upload')
@authorize("system:file:add", log=True)
def upload_api():if 'file' in request.files:photo = request.files['file']mime = request.files['file'].content_typefile_url = upload_curd.upload_one(photo=photo, mime=mime)res = {"msg": "上传成功","code": 0,"success": True,"data":{"src": file_url}}return jsonify(res)return fail_api()

6. flask_sqlalchemy 数据库管理

这个可以单独写一节, 主要是感觉数据库的内容挺多的,这里看看库的样例, 大致样式如下 @ pear-admin-flask/applications/models/admin_user_role.py

from applications.extensions import db# 创建中间表
user_role = db.Table("admin_user_role",  # 中间表名称db.Column("id", db.Integer, primary_key=True, autoincrement=True, comment='标识'),  # 主键db.Column("user_id", db.Integer, db.ForeignKey("admin_user.id"), comment='用户编号'),  # 属性 外键db.Column("role_id", db.Integer, db.ForeignKey("admin_role.id"), comment='角色编号'),  # 属性 外键
)

不明白的可以留言讨论或者自行在百度即可.

7. flask_marshmallow 可将 SQLAlchemy 数据 转换为 RESTful API 格式 , 具体查看项目 内容 @ pear-admin-flask/applications/extensions/init_sqlalchemy.py

from flask_sqlalchemy import SQLAlchemy
from flask_sqlalchemy.query import Query as BaseQuery
from flask_marshmallow import Marshmallow
...
# 重写 BaseQuery
class Query(BaseQuery):...def all_json(self, schema: Marshmallow().Schema):return schema(many=True).dump(self.all())def layui_paginate(self):return self.paginate(page=request.args.get('page', type=int),per_page=request.args.get('limit', type=int),error_out=False)def layui_paginate_json(self, schema: Marshmallow().Schema):"""返回dict"""_res = self.paginate(page=request.args.get('page', type=int),per_page=request.args.get('limit', type=int),error_out=False)return schema(many=True).dump(_res.items), _res.total, _res.page, _res.per_pagedb = SQLAlchemy(query_class=Query)
ma = Marshmallow()

8. flask_migrate 提供数据库的版本管理等功能


9. flask_mail 提供邮件发送功能


10. flask_session 管理会话


11. 我在使用 flask 的时候, 经常 flask_restx 提供的一些方法, 供大家参考 @ flask-restx 基于 flask 的 restful 风格的插件

from flask import Flask
from flask_restx import Api, Resourceapi = Api()app = Flask(__name__)
api.init_app(app)@api.route('/hello',strict_slashes=False)
class HelloWorld(Resource):def get(self):# 如果使用模板的块,需要使用 make_response# return make_response(render_template('index.html', data=res), 200)# 使用 jsonify 是为了返回json数据的同时,相比于 json.dumps() 其会自动修改 content-type 为 application/json# 另外,如果使用 jsonify()的同时,还想自定义返回状态码,可以使用 make_response(jsonify(data=data), 201)return jsonify({'hello': 'world'})def post(self):passdef put(self):passdef delete(self):passif __name__ == '__main__':app.run(debug=True)

也可以使用 flask_restx 提供的参数校验.

from flask_restx import reqparsedef create_reqparse(args):rp = reqparse.RequestParser()for i in args:rp.add_argument(i[0],**i[1])return rpcreate_annotation = create_reqparse([['image_id',{'type':int,'required':True,'location':'json'}],['category_id',{'type':int,'location':'json'}]])@api.route('/')
class AnnotatorData(Resource):@api.expect(create_annotation)def post(self):args = create_annotation.parse_args()...
  1. 还推荐一个延时任务工具 celery, 目前 pear 项目没有使用, 大家可以百度其用法.

相关文章:

基于pear-admin-flask 的 flask 使用教程

我最近接触到了一个极为出色的Flask后台库——pear-admin-flask,这个库具有很高的二次开发价值。借此机会学习并吸收其中Flask开发的一些高级技巧。 1. flask 自定义命令 pear-admin-flask/applications/common/script/admin.py from flask.cli import AppGroup …...

Android 开发投屏软件

一、背景 作为Android开发总会有给他人share自己APP情况,一般在线会议投屏,总是需要在手机上安装对应会议软件特别麻烦~ 二、投屏 Android Studio已经自带了投屏能力,可以在电脑端直接控制手机,同步起来非常方便简单 打开步骤 …...

.Net Web窗口页属性

<%Page %> Page 指令定义 Web 窗体使用的属性&#xff0c;这些属性将被 Web 窗体页分析器和编译器使用。只能包含在 .aspx 文件中。我们每新建一个 Web 页面时&#xff0c;系统会自动为该 Web 页面头部创建一个 Page 指令&#xff0c;来指明页面最基本的属性。 Langu…...

渐变色x轴换行柱状图

// 系统上云率const optionBar {title: {text: 系统上云率,left: left,textStyle: {color: "#fff",fontSize: 14,fontWeight: 650,align: "center",},},color: [#32C5FF, #00F766, #EECB5F],grid: {top: 40,bottom: 0,},legend: { // 控制图例组件show: …...

源支付V7开源版2.99,修复各种提示错误

源支付V7开源版2.99&#xff0c;修复各种提示错误 加密说明&#xff1a;200拿来的&#xff0c;只有8.1这个文件加密&#xff0c;其他文件无任何加密&#xff0c;已修复各种提示错误 测试其他开源版安装提示错误&#xff0c;有几个文件是加密的 注&#xff1a;开发不易&#…...

Mysql中的那些锁

表锁和行锁 表锁&#xff1a;一锁锁整张表&#xff0c;mysql中锁定颗粒度最大的一种&#xff0c;针对非索引字段加的锁。MyISAM和InnoDb都支持。 行锁&#xff1a;一锁只锁整行&#xff0c;锁定颗粒度最小&#xff0c;针对索引字段加的锁。MyISAM不支持&#xff0c;InnoDb支持…...

如何在Linux系统部署ONLYOFFICE协作办公利器并实现多人实时编辑文档

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE&#xff0c;并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…...

Linux部署Sonarqube+Gogs+Jenkins(一)

Linux部署SonarqubeGogsJenkins 一、1.Linux安装JDK11环境1. 本地进行上传2. 进入到/usr/java目录&#xff0c;并且进行解压3. 配置文件/etc/profile&#xff0c;配置环境变量4.让对应的配置文件生效5. 验证 二、Linux安装Python环境三、Linux安装Jenkins环境1、/usr目录下创建…...

程序员开发技术整理(持续整理中)

前端技术&#xff1a; vue-前端框架element-前端框架bootstrap-前端框架echarts-图标组件 C#后端技术&#xff1a; webservice&#xff1a;soap架构&#xff1a;简单的通信协议&#xff0c;用于服务通信ORM框架&#xff1a;对象关系映射&#xff0c;如EF&#xff1a;对象实体…...

Java并查集详解(附Leetcode 547.省份数量讲解)

一、并查集概念 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。 并查集的思想是用一个数组表示了整片森林&#xff08;parent&#xff09;&#xff0c;树的根节点唯一标识了一个集合&#xff0c;我们只要找到了某个元素的的树根&#xff0c;…...

【MySQL】DQL-基础查询-语句&演示(查询多个字段 / 所有字段/并设置别名/去重)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…...

更新一条SQL的执行流程

在 MySQL中&#xff0c;条更新 SQL 语句执行的过程通常包括以下主要步骤: 1.客户端发送请求: 客户端应用程序(如数据库连接器或应用程序)构建一条 UPDATE SQL 语句&#xff0c;并将其发送到 MySOL 服务器端。 2.查询解析和优化: MySQL 服务器接收到请求后&#xff0c;先进行语法…...

深入理解nginx mp4流媒体模块[上]

目录 1. 引言2. 配置3. 源码分析3.1 配置指令3.1.1 mp43.1.2 mp4_buffer_size3.1.3 mp4_max_buffer_size3.1.4 mp4_start_key_frame 3.2 MP4的请求处理过程3.2.1 预处理3.2.2 找到并打开本地mp4文件3.2.3 解析请求参数3.2.4 MP4文件的处理 深入理解nginx mp4流媒体模块[上] 深入…...

Go 之 Gin 框架

Gin 是一个 Go (Golang) 编写的轻量级 web 框架&#xff0c;运行速度非常快&#xff0c;擅长 Api 接口的高并发&#xff0c;如果项目的规模不大&#xff0c;业务相对简单&#xff0c;这个时候我们也推荐您使用 Gin&#xff0c;特别适合微服务框架。 简单路由配置 package mai…...

vue3+threejs新手从零开发卡牌游戏(二十一):添加战斗与生命值关联逻辑

首先将双方玩家的HP存入store中&#xff0c;stores/common.ts代码如下&#xff1a; import { ref, computed } from vue import { defineStore } from piniaexport const useCommonStore defineStore(common, () > {const _font ref() // 字体const p1HP ref(4000) // 己…...

Linux内核err.h文件分析

在阅读和编写内核相关的代码时&#xff0c;经常会看到IS_ERR、ERR_PTR等函数。这些函数在内核头文件的err.h中。以我服务器的代码为例&#xff0c;内核版本为5.15。 这个文件的代码如下&#xff1a; /* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_ERR_H #define _L…...

Qt 富文本处理 (字体颜色大小加粗等)

Qt中支持HTML的控件有textEdit 、label 、textBrowser 。 接口&#xff1a;setHtml("Qt"); toHtml(). 文本样式设置 : 可分字设置 &#xff0c;主要使用QTextCharFormat类进行文本样式设置。 示例&#xff1a; QTextCharFormat fmt; //粗体 fmt.setFontWeight…...

消息队列的七种经典应用场景

在笔者心中&#xff0c;消息队列&#xff0c;缓存&#xff0c;分库分表是高并发解决方案三剑客。 在职业生涯中&#xff0c;笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章&#xff0c;笔者结合自己的真实经历&#xff0c;和大家分享…...

uniapp 微信小程序 canvas 手写板文字重复倾斜水印

核心逻辑 先将坐标系中心点通过ctx.translate(canvasw / 2, canvash / 2) 平移到canvas 中心&#xff0c;再旋转设置水印 假如不 translate 直接旋转&#xff0c;则此时的旋转中心为左上角原点&#xff0c;此时旋转示意如图所示 当translate到中心点之后再旋转&#xff0c;此…...

JavaScript如何制作轮播图

在JavaScript中实现轮播图可以通过多种方式&#xff0c;但最常见的方式是使用数组来存储图片&#xff0c;然后使用setInterval函数定期更改显示的图片。下面是一个简单的例子&#xff1a; 首先&#xff0c;你需要在HTML中设置一些用于显示图片的<img>标签&#xff0c;以…...

【面试经典150 | 动态规划】零钱兑换

文章目录 Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 Tag 【动态规划】【数组】 题目来源 322. 零钱兑换 解题思路 方法一&#xff1a;动态规划 定义状态 dp[i] 表示凑成总金额的最少硬币个数。 状态转移 从小到大枚举要凑成的金额 i&#xff0c;如果当前…...

什么是防火墙,部署防火墙有什么好处?

与我们的房屋没有围墙或界限墙一样&#xff0c;没有防护措施的计算机和网络将容易受到黑客的入侵&#xff0c;这将使我们的网络处于巨大的风险之中。因此&#xff0c;就像围墙保护我们的房屋一样&#xff0c;虚拟墙也可以保护和安全我们的设备&#xff0c;使入侵者无法轻易进入…...

学习鸿蒙基础(10)

目录 一、轮播组件 Swiper 二、列表-List 1、简单的List 2、嵌套的List 三、Tabs容器组件 1、系统自带tabs案例 2、自定义导航栏&#xff1a; 一、轮播组件 Swiper Entry Component struct PageSwiper {State message: string Hello Worldprivate SwCon: SwiperControl…...

阿里云对象存储OSS入门

阅读目录 一、阿里云OSS的使用 1、OSS是什么&#xff1f;2、OSS的使用 二、阿里云OSS的使用三、图床的搭建四&#xff1a;图床绑定阿里云OSS 编写不易&#xff0c;如果我的文章对你有帮助的话&#xff0c;麻烦小伙伴还帮忙点个赞再走&#xff01; 如果有小伙伴觉得写的啰嗦&a…...

[幻灯片]软件需求设计方法学全程实例剖析-03-业务用例图和业务序列图

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 pdf已上传至本号的CSDN资源&#xff0c;或到以下地址下载&#xff1a; http://umlchina.com/training/umlchina_03_bm.pdf...

ctfshow-web入门-xxe

什么是xxe&#xff1f; XXE&#xff0c;全称XML External Entity Injection&#xff0c;即XML外部实体注入。这是一种针对应用程序解析XML输入类型的攻击。当包含对外部实体的引用的XML输入被弱配置的XML解析器处理时&#xff0c;就会发生这种攻击。这种攻击通过构造恶意内容&…...

Docker数据卷挂载

一、容器与数据耦合的问题: 数据卷是虚拟的&#xff0c;不真实存在的&#xff0c;它指向文件中的文件夹 &#xff0c;属主机文件系统通过数据卷和容器数据进行联系&#xff0c;你改变我也改变。 解决办法&#xff1a; 对宿主机文件系统内的文件进行修改&#xff0c;会立刻反应…...

QT_day4:对话框

1、完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&…...

矢量数据库:连接人工智能应用程序的数据复杂性与可用性的桥梁

关注我的公众号&#xff1a;Halo咯咯 简介 矢量数据库是一种专门设计的数据库&#xff0c;专注于高效地存储、管理和操作矢量数据。与传统数据库处理标量值&#xff08;如数字、字符串、日期&#xff09;不同&#xff0c;矢量数据库针对的是那些表现为多维数据点的向量&#xf…...

docker:can’t create unix socket /var/run/docker.sock: is a directory

docker:can’t create unix socket /var/run/docker.sock: is a directory 原因&#xff1a;docker.sock不能创建 解决方式&#xff1a; rm -rf /var/run/docker.sock 然后重新启动docker Docker是一种相对使用较简单的容器&#xff0c;我们可以通过以下几种方式获取信息&…...

网页设计与制作实用教程(第3版)/网站结构优化的内容和方法

20150803 Created By BaoXinjian 一、摘要 1. JXL 1.1 JXL优点&#xff1a; Jxl对中文支持非常好&#xff0c;操作简单&#xff0c;方法看名知意。 Jxl是纯javaAPI&#xff0c;在跨平台上表现的非常完美&#xff0c;代码可以再windows或者Linux上运行而无需重新编写 支持Excel …...

新手学做网站学哪些知识/百度指数排名

仿网易云音乐(webapp) 项目地址 (project address) api来源 感谢binaryify让我能用喜欢的东西做一个属于自己的播放器! 源码地址 不要脸的求star 哈哈哈!!! 项目预览 1mhere.cn (pc端按F12切换手机调试模式效果更佳!) (移动端可直接扫码) 技术栈 (technology) vue2.0 vuex v…...

宁波专业做网站公司/优化落实新十条措施

下載转载于:https://www.cnblogs.com/wang123/archive/2008/02/21/1076370.html...

晋城市公用事业建设局网站/店铺如何运营和推广

版本 JDK8(JDK1.8) Consumer函数式接口源码重点 1.Consumer函数式接口需要实现的方法是 void accept(T t)&#xff0c;表示一个接受单个输入参数但不返回结果的操作。 2.Consumer andThen(Consumer<? super T> after) 用于拼接多个Consumer的accept(T t)方法&#xff0…...

公司网站建设公/衡阳网站建设公司

\r\n302 Found \r\npr-nginx_1-0-221_BRANCH Branch\nTime : Wed May 20 10:35:46 CST 2015 \r\n...

网站建设推广优化招聘模板/百度在线

1、打开secureCRT&#xff0c;连接到数据库所在的linux机器。切换到了oracle用户下。 su - oracle 2、关掉oracle的监听进程 lsnrctl stop 这时外部没法连接到数据库了。 3、杀掉所有session。 ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCALNO|awk {print $2}|xargs …...