基于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 项目没有使用, 大家可以百度其用法.

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

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

相关文章

CUDA从入门到放弃(十四):CUDA Thrust库

CUDA从入门到放弃(十四):CUDA Thrust库 Thrust 是一个基于标准模板库(STL)的 C 模板库,专为 CUDA 设计,旨在简化高性能并行应用的开发。它提供了一系列数据并行原语,如扫描、排序和…

vue基础教程(4)——十分钟吃透vue路由router

同学们可以私信我加入学习群! 正文开始 前言一、路由概念二、路由使用三、创建路由对应的组件四、给整个项目一个入口总结 前言 前面的文章运行成功后,页面显示如下: 在这个页面中,点击Home和About都会切换右面的页面内容&#…

《责任链模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式(极简c版)》-CSDN博客 模式说明 方案: 责任链模式将请求的发送者和接收者解耦,构成一个链条,并由多个对象对请求进行处理,直到找到合适的处理者为止。优点: …

iOS UIFont-真香警告之字体管理类

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS UIFont-实现三方字体的下载和使用 第三弹搭建字体管理类:iOS UIFont-真香警告之字体管理类 前言 不知道友们是否有过这种经历,项目已经迭代了很多版本,项目中的文件已经上千个了…

uniapp数组合并函数使用几录

let that { listAll: [1, 2, 3] }; let data [4, 5, 6]; let mergedArray that.listAll.concat(data); console.log(mergedArray); // 输出: [1, 2, 3, 4, 5, 6] console.log(that.listAll); // 输出: [1, 2, 3],原始数组没有改变 唯有美景,可以抚…

基于SSM+Jsp+Mysql的医院远程诊断系统

开发语言:Java框架:ssm技术:JSPJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包…

故障诊断 | 基于FTNN网络模型的故障诊断(Pytorch)

效果分析 基本介绍 FTNN是一种基于神经网络的故障诊断模型,它旨在识别和定位系统中的故障。使用已标记的数据集对FTNN模型进行训练。标记的数据集包括系统在正常和故障状态下的数据,以及对应的故障标签。通过算法和优化方法,调整网络参数以最小化预测误差。使用独立的测试数…

linux三剑客之grep

grep命令 基本语法 示例 搜索文件 example.txt 中包含单词 "example" 的所有行: grep -v "example" example.txt 计算文件 example.txt 中包含 "example" 的行数: grep -c "example" example.txt 显示 example.txt 中包含 "e…

SQLite中的隔离(八)

返回:SQLite—系列文章目录 上一篇:SQLite版本3中的文件锁定和并发(七) 下一篇:SQLite—系列文章目录 数据库的“isolation”属性确定何时对 一个操作的数据库对其他并发操作可见。 数据库连接之间的隔离 如果使用两个不…

Flume面试题及参考答案

在大数据领域,Flume是一个不可或缺的工具,它负责可靠地收集、聚合和移动大量日志数据。作为一名大数据架构师,掌握Flume的工作原理和最佳实践对于构建高效的数据处理流水线至关重要。本文将深入探讨一系列Flume面试题,并提供详尽的参考答案,以帮助读者在面试中表现出色,并…

LeetCode-2908. 元素和最小的山形三元组 I【数组,前后缀分解】

LeetCode-2908. 元素和最小的山形三元组 I【数组】 题目描述&#xff1a;解题思路一&#xff1a;暴力解法&#xff0c;三个for循环解题思路二&#xff1a;优化&#xff0c;这里注意到1 < nums[i] < 50&#xff0c;其实如果有山形三元组&#xff0c;那么result是一定小于等…

汽车电子行业知识:汽车电子领域包含哪些技术

汽车电子行业涉及到许多方面的知识&#xff0c;包括但不限于&#xff1a; 汽车电子控制单元&#xff08;ECU&#xff09;&#xff1a;负责监控和控制车辆的各种系统&#xff0c;如发动机控制单元、制动系统控制单元、空调系统控制单元等。汽车传感器技术&#xff1a;包括温度传…

Luigi任务调度框架学习2:运行每一个Task,避免因判定完成导致跳过执行Task主程序

在上一篇Luigi的线性调度文章中&#xff08;Luigi任务调度框架学习1&#xff1a;线性调用流程&#xff09;&#xff0c;我们知道Task运行的时候&#xff1a; 每个任务是否完成有两次判定&#xff0c;即&#xff1a;进行判定(未完成) 》运行def run(self)函数 》进行判定(完成) …

国产暴雨AI服务器X3418开启多元自主可控新篇章

在当前数字化转型的大潮中&#xff0c;算力作为新质生产力的重要动力引擎&#xff0c;对推动经济社会发展起着关键作用。尤其在人工智能领域&#xff0c;随着高性能、安全可控的AI算力需求持续攀升&#xff0c;国产化服务器的研发与应用显得尤为迫切。 作为国内专业的算力基础…

mysql5.7 源码分析--初始化

集中在sql\mysqld.cc文件的mysqld_main函数中&#xff08;&#xff09;&#xff1a; 主程序入口 在sql\main.cc文件中&#xff1a; int main(int argc, char **argv) {return mysqld_main(arg, argv); } 一、mysql为了跨平台&#xff0c;对win32系统做了单独的初始化&#x…

【ENSP】交换机和路由器之间实现静态路由

1.概念 三层交换机只能在Vlanif逻辑口配置iP地址 路由器的每一个端口都是另外一个网段 2.实现方法 交换机允许对应vlan通行&#xff0c;配置vlanif的ip地址&#xff0c;做静态路由 路由器&#xff0c;进接口配置对应的ip&#xff0c;路由器和交换机相连的口&#xff0c;进入他的…

文心一言 VS 讯飞星火 VS chatgpt (225)-- 算法导论16.3 7题

七、推广赫夫曼算法&#xff0c;使之能生成三进制的码字(即码字由符号0、1、2组成)&#xff0c;并证明你的算法能生成最优三进制码。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 推广赫夫曼算法以生成三进制码字需要对算法进行一定的修改&#xff0c;确保在每…

JavaScript是如何实现页面渲染的

JavaScript实现页面渲染主要涉及到对DOM的操作、样式的修改以及与后端数据的交互。以下是JavaScript实现页面渲染的主要步骤和方式&#xff1a; 一、DOM操作 创建和修改元素&#xff1a;JavaScript可以使用document.createElement()来创建新的DOM元素&#xff0c;使用appendC…

力软框架打开新的对话框,点击对话框确认按钮的事件AcceptClick的方法

// 原来在力软框架下&#xff0c;点击哪个确认按钮的时候 top.frames[iframeId].AcceptClick直接用这个方法就可以了 &#xff0c;那个方法是直接返回方法的但是不知道是什么情况。如图二所示。死活就返回了ifram标签不知道是什么原因&#xff0c;就获取不到对话框里边自己定义…

求交错数列前n项和:输⼊⼀个正整数n,计算交错序列1-2/3+3/5-4/7+5/9-6/11+... 的前n项之和。试编写相应程序。

#include <stdio.h> #include <string.h> int main() { // 求交错数列前n项和&#xff1a;输个正整数n&#xff0c;计算交错序列1-2/33/5-4/75/9-6/11... 的前n // 项之和。试编写相应程序。 int sign 1; float sum 0; int n; scanf("…