更新依赖,使用flask新路由定义方法

This commit is contained in:
mkg
2021-06-12 12:59:56 +08:00
parent f274e060f4
commit 48633729fb
11 changed files with 155 additions and 153 deletions
+3 -3
View File
@@ -13,7 +13,7 @@ admin_log = Blueprint('adminLog', __name__, url_prefix='/admin/log')
# ----------------------------------------------------------
@admin_log.route('/')
@admin_log.get('/')
@authorize("admin:log:main")
def index():
return render_template('admin/admin_log/main.html')
@@ -24,7 +24,7 @@ def index():
# ==========================================================
@admin_log.route('/loginLog')
@admin_log.get('/loginLog')
@authorize("admin:log:main")
def loginLog():
page = request.args.get('page', type=int)
@@ -43,7 +43,7 @@ def loginLog():
# ==========================================================
@admin_log.route('/operateLog')
@admin_log.get('/operateLog')
@authorize("admin:log:main")
def operateLog():
page = request.args.get('page', type=int)
+3 -16
View File
@@ -1,21 +1,8 @@
from flask import Blueprint, request, render_template, jsonify
from flask_login import login_required
from flask_marshmallow import Marshmallow
from flask import Blueprint
from applications.models import db
ma = Marshmallow()
admin_curd = Blueprint('adminCurd', __name__, url_prefix='/admin/curd')
@admin_curd.route('/')
def index():
colums=[]
colums.append("table_name")
colums.append(db.Column('id',db.Integer))
colums.append(db.Column('id', db.Integer, primary_key=True, comment="ID"))
colums.append(db.Column('url', db.String(255), comment=u"来源"))
colums.append(db.Column('date', db.DateTime, comment=u"记录时间"))
colums.append(db.Column('status', db.Integer, comment=u"是否回访"))
re = db.Table(*colums).columns
db.create_all()
return str(re)
return "功能开发中"
+10 -10
View File
@@ -9,13 +9,13 @@ from applications.service.route_auth import authorize
admin_dept = Blueprint('adminDept', __name__, url_prefix='/admin/dept')
@admin_dept.route('/')
@admin_dept.get('/')
@authorize("admin:dept:main", log=True)
def main():
return render_template('admin/dept/main.html')
@admin_dept.route('/data')
@admin_dept.get('/data')
@authorize("admin:dept:main", log=True)
def data():
power_data = dept_curd.get_dept_dict()
@@ -25,13 +25,13 @@ def data():
return jsonify(res)
@admin_dept.route('/add')
@admin_dept.get('/add')
@authorize("admin:dept:add", log=True)
def add():
return render_template('admin/dept/add.html')
@admin_dept.route('/tree')
@admin_dept.get('/tree')
@authorize("admin:dept:main", log=True)
def tree():
power_data = dept_curd.get_dept_dict()
@@ -43,7 +43,7 @@ def tree():
return jsonify(res)
@admin_dept.route('/save', methods=['POST'])
@admin_dept.post('/save')
@authorize("admin:dept:add", log=True)
def save():
req = request.json
@@ -52,7 +52,7 @@ def save():
return success_api(msg="成功")
@admin_dept.route('/edit', methods=['GET', 'POST'])
@admin_dept.get('/edit')
@authorize("admin:dept:edit", log=True)
def edit():
id = request.args.get("deptId")
@@ -61,7 +61,7 @@ def edit():
# 启用
@admin_dept.route('/enable', methods=['PUT'])
@admin_dept.put('/enable')
@authorize("admin:dept:edit", log=True)
def enable():
id = request.json.get('deptId')
@@ -74,7 +74,7 @@ def enable():
# 禁用
@admin_dept.route('/disable', methods=['PUT'])
@admin_dept.put('/disable')
@authorize("admin:dept:edit", log=True)
def disenable():
id = request.json.get('deptId')
@@ -86,7 +86,7 @@ def disenable():
return fail_api(msg="数据错误")
@admin_dept.route('/update', methods=['PUT'])
@admin_dept.put('/update')
@authorize("admin:dept:edit", log=True)
def update():
req = request.json
@@ -97,7 +97,7 @@ def update():
return success_api(msg="更新成功")
@admin_dept.route('/remove/<int:id>', methods=['DELETE'])
@admin_dept.delete('/remove/<int:id>')
@authorize("admin:dept:remove", log=True)
def remove(id):
res = dept_curd.remove_dept(id)
+18 -18
View File
@@ -9,13 +9,13 @@ admin_dict = Blueprint('adminDict', __name__, url_prefix='/admin/dict')
# 数据字典
@admin_dict.route('/')
@admin_dict.get('/')
@authorize("admin:dict:main", log=True)
def main():
return render_template('admin/dict/main.html')
@admin_dict.route('/dictType/data')
@admin_dict.get('/dictType/data')
@authorize("admin:dict:main", log=True)
def dictType_data():
page = request.args.get('page', type=int)
@@ -25,13 +25,13 @@ def dictType_data():
return table_api(data=data,count=count)
@admin_dict.route('/dictType/add')
@admin_dict.get('/dictType/add')
@authorize("admin:dict:add", log=True)
def dictType_add():
return render_template('admin/dict/add.html')
@admin_dict.route('/dictType/save', methods=['POST'])
@admin_dict.post('/dictType/save')
@authorize("admin:dict:add", log=True)
def dictType_save():
req_json = request.json
@@ -42,7 +42,7 @@ def dictType_save():
# 编辑字典类型
@admin_dict.route('/dictType/edit', methods=['GET', 'POST'])
@admin_dict.get('/dictType/edit')
@authorize("admin:dict:edit", log=True)
def dictType_edit():
id = request.args.get('dictTypeId', type=int)
@@ -51,7 +51,7 @@ def dictType_edit():
# 编辑字典类型
@admin_dict.route('/dictType/update', methods=['PUT'])
@admin_dict.put('/dictType/update')
@authorize("admin:dict:edit", log=True)
def dictType_update():
req_json = request.json
@@ -60,7 +60,7 @@ def dictType_update():
# 启用字典
@admin_dict.route('/dictType/enable', methods=['PUT'])
@admin_dict.put('/dictType/enable')
@authorize("admin:dict:edit", log=True)
def dictType_enable():
id = request.json.get('id')
@@ -73,7 +73,7 @@ def dictType_enable():
# 禁用字典
@admin_dict.route('/dictType/disable', methods=['PUT'])
@admin_dict.put('/dictType/disable')
@authorize("admin:dict:edit", log=True)
def dictType_disenable():
id = request.json.get('id')
@@ -86,7 +86,7 @@ def dictType_disenable():
# 删除字典类型
@admin_dict.route('/dictType/remove/<int:id>', methods=['DELETE'])
@admin_dict.delete('/dictType/remove/<int:id>')
@authorize("admin:dict:remove", log=True)
def dictType_delete(id):
res = dict_curd.delete_type_by_id(id)
@@ -95,7 +95,7 @@ def dictType_delete(id):
return success_api(msg="删除成功")
@admin_dict.route('/dictData/data')
@admin_dict.get('/dictData/data')
@authorize("admin:dict:main", log=True)
def dictCode_data():
page = request.args.get('page', type=int)
@@ -106,7 +106,7 @@ def dictCode_data():
# 增加字典数据
@admin_dict.route('/dictData/add')
@admin_dict.get('/dictData/add')
@authorize("admin:dict:add", log=True)
def dictData_add():
type_code = request.args.get('typeCode', type=str)
@@ -114,18 +114,18 @@ def dictData_add():
# 增加字典数据
@admin_dict.route('/dictData/save', methods=['POST'])
@admin_dict.get('/dictData/save')
@authorize("admin:dict:add", log=True)
def dictData_save():
req_json = request.json
res = dict_curd.save_dict_data(req_json=req_json)
if res == None:
if not res:
return jsonify(success=False, msg="增加失败")
return jsonify(success=True, msg="增加成功")
# 编辑字典数据
@admin_dict.route('/dictData/edit', methods=['GET', 'POST'])
@admin_dict.get('/dictData/edit')
@authorize("admin:dict:edit", log=True)
def dictData_edit():
id = request.args.get('dataId', type=str)
@@ -134,7 +134,7 @@ def dictData_edit():
# 编辑字典数据
@admin_dict.route('/dictData/update', methods=['PUT'])
@admin_dict.put('/dictData/update')
@authorize("admin:dict:edit", log=True)
def dictData_update():
req_json = request.json
@@ -143,7 +143,7 @@ def dictData_update():
# 启用字典数据
@admin_dict.route('/dictData/enable', methods=['PUT'])
@admin_dict.put('/dictData/enable')
@authorize("admin:dict:edit", log=True)
def dictData_enable():
id = request.json.get('dataId')
@@ -156,7 +156,7 @@ def dictData_enable():
# 禁用字典数据
@admin_dict.route('/dictData/disable', methods=['PUT'])
@admin_dict.put('/dictData/disable')
@authorize("admin:dict:edit", log=True)
def dictData_disenable():
id = request.json.get('dataId')
@@ -169,7 +169,7 @@ def dictData_disenable():
# 删除字典类型
@admin_dict.route('dictData/remove/<int:id>', methods=['DELETE'])
@admin_dict.delete('dictData/remove/<int:id>')
@authorize("admin:dict:remove", log=True)
def dictData_delete(id):
res = dict_curd.delete_data_by_id(id)
+14 -8
View File
@@ -5,18 +5,19 @@ from applications.models.admin_photo import Photo
from applications.service.admin import file_curd
from applications.service.common.response import table_api, success_api, fail_api
from applications.service.route_auth import authorize
admin_file = Blueprint('adminFile', __name__, url_prefix='/admin/file')
# 图片管理
@admin_file.route('/')
@admin_file.get('/')
@authorize("admin:file:main", log=True)
def index():
return render_template('admin/photo/photo.html')
# 图片数据
@admin_file.route('/table')
@admin_file.get('/table')
@authorize("admin:file:main", log=True)
def table():
page = request.args.get('page', type=int)
@@ -25,24 +26,29 @@ def table():
return table_api(data=data, count=count)
# 上传接口
@admin_file.route('/upload', methods=['GET', 'POST'])
# 上传
@admin_file.get('/upload')
@authorize("admin:file:add", log=True)
def upload():
if request.method == 'POST' and 'file' in request.files:
return render_template('admin/photo/photo_add.html')
# 上传接口
@admin_file.post('/upload')
@authorize("admin:file:add", log=True)
def upload_api():
if 'file' in request.files:
photo = request.files['file']
mime = request.files['file'].content_type
file_url = file_curd.upload_one(photo=photo, mime=mime)
res = {
"msg": "上传成功",
"code": 0,
"success":True,
"success": True,
"data":
{"src": file_url}
}
return jsonify(res)
return render_template('admin/photo/photo_add.html')
return fail_api()
# 图片删除
+44 -40
View File
@@ -9,7 +9,7 @@ admin_index = Blueprint('adminIndex', __name__, url_prefix='/admin')
# 首页
@admin_index.route('/')
@admin_index.get('/')
@login_required
def index():
user = current_user
@@ -17,14 +17,14 @@ def index():
# 渲染配置
@admin_index.route('/config')
@admin_index.get('/config')
@login_required
def config():
return index_curd.get_render_config()
# 获取验证码
@admin_index.route('/getCaptcha', methods=["GET"])
@admin_index.get('/getCaptcha')
def getCaptcha():
resp, code = index_curd.get_captcha()
session["code"] = code
@@ -32,48 +32,52 @@ def getCaptcha():
# 登录
@admin_index.route('/login', methods=['GET', 'POST'])
@admin_index.get('/login')
def login():
if request.method == 'POST':
req = request.form
username = req.get('username')
password = req.get('password')
code = req.get('captcha')
if not username or not password or not code:
return fail_api(msg="用户名或密码没有输入")
s_code = session.get("code", None)
if not all([code, s_code]):
return fail_api(msg="参数错误")
if code != s_code:
return fail_api(msg="验证码错误")
user = User.query.filter_by(username=username).first()
if user is None:
return fail_api(msg="不存在的用户")
if user.enable is 0:
return fail_api(msg="用户被暂停使用")
if username == user.username and user.validate_password(password):
# 登录
login_user(user)
# 记录登录日志
login_log(request, uid=user.id, is_access=True)
# 存入权限
index_curd.add_auth_session()
return success_api(msg="登录成功")
login_log(request, uid=user.id, is_access=False)
return fail_api(msg="用户名或密码错误")
if current_user.is_authenticated:
return redirect(url_for('adminIndex.index'))
return render_template('admin/login.html')
# 登录
@admin_index.post('/login')
def login_post():
req = request.form
username = req.get('username')
password = req.get('password')
code = req.get('captcha')
if not username or not password or not code:
return fail_api(msg="用户名或密码没有输入")
s_code = session.get("code", None)
if not all([code, s_code]):
return fail_api(msg="参数错误")
if code != s_code:
return fail_api(msg="验证码错误")
user = User.query.filter_by(username=username).first()
if user is None:
return fail_api(msg="不存在的用户")
if user.enable is 0:
return fail_api(msg="用户被暂停使用")
if username == user.username and user.validate_password(password):
# 登录
login_user(user)
# 记录登录日志
login_log(request, uid=user.id, is_access=True)
# 存入权限
index_curd.add_auth_session()
return success_api(msg="登录成功")
login_log(request, uid=user.id, is_access=False)
return fail_api(msg="用户名或密码错误")
# 退出登录
@admin_index.route('/logout', methods=['GET', 'POST'])
@admin_index.post('/logout')
@login_required
def logout():
logout_user()
@@ -82,7 +86,7 @@ def logout():
# 菜单
@admin_index.route('/menu')
@admin_index.get('/menu')
@login_required
def menu():
menu_tree = index_curd.make_menu_tree()
@@ -90,7 +94,7 @@ def menu():
# 控制台页面
@admin_index.route('/welcome')
@admin_index.get('/welcome')
@login_required
def welcome():
return render_template('admin/console/console.html')
+2 -2
View File
@@ -14,7 +14,7 @@ admin_Monitor = Blueprint('adminMonitor', __name__, url_prefix='/admin/monitor')
# 系统监控
@admin_Monitor.route('/')
@admin_Monitor.get('/')
@authorize("admin:monitor:main", log=True)
def main():
# 主机名称
@@ -79,7 +79,7 @@ def main():
# 图表api
@admin_Monitor.route('/polling')
@admin_Monitor.get('/polling')
@authorize("admin:monitor:main")
def ajax_polling():
# 获取cup使用率
+11 -11
View File
@@ -6,13 +6,13 @@ from applications.service.route_auth import authorize
admin_power = Blueprint('adminPower', __name__, url_prefix='/admin/power')
@admin_power.route('/')
@admin_power.get('/')
@authorize("admin:power:main", log=True)
def index():
return render_template('admin/power/main.html')
@admin_power.route('/data')
@admin_power.get('/data')
@authorize("admin:power:main", log=True)
def data():
power_data = power_curd.get_power_dict()
@@ -22,13 +22,13 @@ def data():
return jsonify(res)
@admin_power.route('/add')
@admin_power.get('/add')
@authorize("admin:power:add", log=True)
def add():
return render_template('admin/power/add.html')
@admin_power.route('/selectParent')
@admin_power.get('/selectParent')
@authorize("admin:power:main", log=True)
def selectParent():
power_data = power_curd.select_parent()
@@ -41,7 +41,7 @@ def selectParent():
# 增加
@admin_power.route('/save', methods=['POST'])
@admin_power.post('/save')
@authorize("admin:power:add", log=True)
def save():
req = request.json
@@ -50,7 +50,7 @@ def save():
# 权限编辑
@admin_power.route('/edit/<int:id>', methods=['GET', 'POST'])
@admin_power.get('/edit/<int:id>')
@authorize("admin:power:edit", log=True)
def edit(id):
power = power_curd.get_power_by_id(id)
@@ -63,7 +63,7 @@ def edit(id):
# 权限更新
@admin_power.route('/update', methods=['PUT'])
@admin_power.put('/update')
@authorize("admin:power:edit", log=True)
def update():
res = power_curd.update_power(request.json)
@@ -73,7 +73,7 @@ def update():
# 启用权限
@admin_power.route('/enable', methods=['PUT'])
@admin_power.put('/enable')
@authorize("admin:power:edit", log=True)
def enable():
id = request.json.get('powerId')
@@ -86,7 +86,7 @@ def enable():
# 禁用权限
@admin_power.route('/disable', methods=['PUT'])
@admin_power.put('/disable')
@authorize("admin:power:edit", log=True)
def disenable():
id = request.json.get('powerId')
@@ -99,7 +99,7 @@ def disenable():
# 权限删除
@admin_power.route('/remove/<int:id>', methods=['DELETE'])
@admin_power.delete('/remove/<int:id>')
@authorize("admin:power:remove", log=True)
def remove(id):
r = power_curd.remove_power(id)
@@ -110,7 +110,7 @@ def remove(id):
# 批量删除
@admin_power.route('/batchRemove', methods=['DELETE'])
@admin_power.delete('/batchRemove')
@authorize("admin:power:remove", log=True)
def batchRemove():
ids = request.form.getlist('ids[]')
+13 -13
View File
@@ -9,14 +9,14 @@ admin_role = Blueprint('adminRole', __name__, url_prefix='/admin/role')
# 用户管理
@admin_role.route('/')
@admin_role.get('/')
@authorize("admin:role:main", log=True)
def main():
return render_template('admin/role/main.html')
# 表格数据
@admin_role.route('/data')
@admin_role.get('/data')
@authorize("admin:role:main", log=True)
def table():
page = request.args.get('page', type=int)
@@ -33,7 +33,7 @@ def table():
# 角色增加
@admin_role.route('/add')
@admin_role.get('/add')
@authorize("admin:role:add", log=True)
@login_required
def add():
@@ -41,7 +41,7 @@ def add():
# 角色增加
@admin_role.route('/save', methods=['POST'])
@admin_role.post('/save')
@authorize("admin:role:add", log=True)
def save():
req = request.json
@@ -50,14 +50,14 @@ def save():
# 角色授权
@admin_role.route('/power/<int:id>')
@admin_role.get('/power/<int:id>')
@authorize("admin:role:power", log=True)
def power(id):
return render_template('admin/role/power.html', id=id)
# 获取角色权限
@admin_role.route('/getRolePower/<int:id>')
@admin_role.get('/getRolePower/<int:id>')
@authorize("admin:role:main", log=True)
def getRolePower(id):
powers = role_curd.get_role_power(id)
@@ -69,7 +69,7 @@ def getRolePower(id):
# 保存角色权限
@admin_role.route('/saveRolePower', methods=['PUT'])
@admin_role.put('/saveRolePower')
@authorize("admin:role:edit", log=True)
def saveRolePower():
req_form = request.form
@@ -81,7 +81,7 @@ def saveRolePower():
# 角色编辑
@admin_role.route('/edit/<int:id>', methods=['GET', 'POST'])
@admin_role.get('/edit/<int:id>')
@authorize("admin:role:edit", log=True)
def edit(id):
role = role_curd.get_role_by_id(id)
@@ -89,7 +89,7 @@ def edit(id):
# 更新角色
@admin_role.route('/update', methods=['PUT'])
@admin_role.put('/update')
@authorize("admin:role:edit", log=True)
def update():
res = role_curd.update_role(request.json)
@@ -99,7 +99,7 @@ def update():
# 启用用户
@admin_role.route('/enable', methods=['PUT'])
@admin_role.put('/enable')
@authorize("admin:role:edit", log=True)
def enable():
id = request.json.get('roleId')
@@ -113,7 +113,7 @@ def enable():
# 禁用用户
@admin_role.route('/disable', methods=['PUT'])
@admin_role.put('/disable')
@authorize("admin:role:edit", log=True)
def disenable():
id = request.json.get('roleId')
@@ -126,7 +126,7 @@ def disenable():
# 角色删除
@admin_role.route('/remove/<int:id>', methods=['DELETE'])
@admin_role.delete('/remove/<int:id>')
@authorize("admin:role:remove", log=True)
def remove(id):
res = role_curd.remove_role(id)
@@ -136,7 +136,7 @@ def remove(id):
# 批量删除
@admin_role.route('/batchRemove', methods=['DELETE'])
@admin_role.delete('/batchRemove')
@authorize("admin:role:remove", log=True)
@login_required
def batchRemove():
+16 -16
View File
@@ -11,14 +11,14 @@ admin_user = Blueprint('adminUser', __name__, url_prefix='/admin/user')
# 用户管理
@admin_user.route('/')
@admin_user.get('/')
@authorize("admin:user:main", log=True)
def main():
return render_template('admin/user/main.html')
# 用户分页查询
@admin_user.route('/data')
@admin_user.get('/data')
@authorize("admin:user:main", log=True)
def data():
page = request.args.get('page', type=int)
@@ -36,14 +36,14 @@ def data():
# 用户增加
@admin_user.route('/add')
@admin_user.get('/add')
@authorize("admin:user:add",log=True)
def add():
roles = Role.query.all()
return render_template('admin/user/add.html', roles=roles)
@admin_user.route('/save', methods=['POST'])
@admin_user.post('/save')
@authorize("admin:user:add", log=True)
def save():
req_json = request.json
@@ -66,7 +66,7 @@ def save():
# 删除用户
@admin_user.route('/remove/<int:id>', methods=['DELETE'])
@admin_user.delete('/remove/<int:id>')
@authorize("admin:user:remove", log=True)
def delete(id):
res = user_curd.delete_by_id(id)
@@ -76,7 +76,7 @@ def delete(id):
# 编辑用户
@admin_user.route('/edit/<int:id>', methods=['GET', 'POST'])
@admin_user.get('/edit/<int:id>')
@authorize("admin:user:edit", log=True)
def edit(id):
user = User.query.filter_by(id=id).first()
@@ -88,7 +88,7 @@ def edit(id):
# 编辑用户
@admin_user.route('/update', methods=['PUT'])
@admin_user.put('/update')
@authorize("admin:user:edit", log=True)
def update():
req_json = request.json
@@ -104,7 +104,7 @@ def update():
# 个人中心
@admin_user.route('/center')
@admin_user.get('/center')
@login_required
def center():
user_info = current_user
@@ -113,14 +113,14 @@ def center():
# 修改头像
@admin_user.route('/profile')
@admin_user.get('/profile')
@login_required
def profile():
return render_template('admin/user/profile.html')
# 修改头像
@admin_user.route('/updateAvatar', methods=['PUT'])
@admin_user.put('/updateAvatar')
@login_required
def updateAvatar():
url = request.json.get("avatar").get("src")
@@ -130,7 +130,7 @@ def updateAvatar():
# 修改当前用户信息
@admin_user.route('/updateInfo', methods=['PUT'])
@admin_user.put('/updateInfo')
@login_required
def updateInfo():
res_json = request.json
@@ -140,14 +140,14 @@ def updateInfo():
# 修改当前用户密码
@admin_user.route('/editPassword', methods=['GET'])
@admin_user.get('/editPassword')
@login_required
def editPassword():
return render_template('admin/user/edit_password.html')
# 修改当前用户密码
@admin_user.route('/editPassword', methods=['PUT'])
@admin_user.put('/editPassword')
@login_required
def edit_password_put():
res_json = request.json
@@ -155,7 +155,7 @@ def edit_password_put():
# 启用用户
@admin_user.route('/enable', methods=['PUT'])
@admin_user.put('/enable')
@authorize("admin:user:edit",log=True)
def enable():
id = request.json.get('userId')
@@ -168,7 +168,7 @@ def enable():
# 禁用用户
@admin_user.route('/disable', methods=['PUT'])
@admin_user.put('/disable')
@authorize("admin:user:edit",log=True)
def disenable():
id = request.json.get('userId')
@@ -181,7 +181,7 @@ def disenable():
# 批量删除
@admin_user.route('/batchRemove', methods=['DELETE'])
@admin_user.delete('/batchRemove')
@authorize("admin:user:remove", log=True)
def batchRemove():
ids = request.form.getlist('ids[]')
+21 -16
View File
@@ -1,29 +1,34 @@
alembic==1.5.4
alembic==1.6.5
blinker==1.4
captcha==0.3
click==7.1.2
Flask==1.1.2
click==8.0.1
colorama==0.4.4
Flask==2.0.1
Flask-DebugToolbar==0.11.0
Flask-Login==0.5.0
flask-marshmallow==0.14.0
Flask-Migrate==2.6.0
Flask-Migrate==3.0.1
Flask-Reuploaded==1.1.0
Flask-Script==2.0.6
Flask-SQLAlchemy==2.4.4
Flask_Reuploaded==0.5.0
itsdangerous==1.1.0
Jinja2==2.11.3
Flask-SQLAlchemy==2.5.1
greenlet==1.1.0
importlib-metadata==4.5.0
itsdangerous==2.0.1
Jinja2==3.0.1
Mako==1.1.4
MarkupSafe==1.1.1
marshmallow==3.10.0
marshmallow-sqlalchemy==0.24.2
Pillow==8.1.0
MarkupSafe==2.0.1
marshmallow==3.12.1
marshmallow-sqlalchemy==0.26.1
Pillow==8.2.0
psutil==5.8.0
PyMySQL==1.0.2
python-dateutil==2.8.1
python-dotenv==0.15.0
python-dotenv==0.17.1
python-editor==1.0.4
PyYAML==5.4.1
six==1.15.0
SQLAlchemy==1.3.23
six==1.16.0
SQLAlchemy==1.4.18
sqlparse==0.4.1
Werkzeug==1.0.1
typing-extensions==3.10.0.0
Werkzeug==2.0.1
zipp==3.4.1