FLASK项目快速构建

Flask 项目构建

exts.py

# flask_sqlalchemy
from flask_sqlalchemy import SQLAlchemy
from flask_mail import Mail
from flask_caching import Cache
from flask_wtf import CSRFProtect
from flask_avatars import Avatars
from flask_jwt_extended import JWTManager
from flask_cors import CORSdb = SQLAlchemy()
mail = Mail()
cache = Cache()
csrf = CSRFProtect()
avatars = Avatars()
jwt = JWTManager()
cors = CORS()from gevent import pywsgifrom geventwebsocket.handler import WebSocketHandlerserver = pywsgi.WSGIServer(('0.0.0.0', 8099), app, handler_class=WebSocketHandler)server.serve_forever()

config.py


import os#===============================================================================
# 基础路由配置
#===============================================================================
BASE_DIR = os.path.dirname(os.path.abspath(__file__))#===============================================================================
# 随机密钥
#===============================================================================
SECRET_KEY = "dfasdfsdflasdjfl"#===============================================================================
# msyql 数据库配置
#===============================================================================
from utils.configUtils import get_section_dictcfg_msyql = get_section_dict(file_path=os.path.join(BASE_DIR,"config.ini"),section="mysql"
)DB_URI = 'mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8mb4' % (cfg_msyql.get("user","root"),cfg_msyql.get("password","123456"),cfg_msyql.get("host","localhost"),cfg_msyql.get("port","3306"),cfg_msyql.get("database","employee_face_recognition_and_behavior_detection"),)SQLALCHEMY_DATABASE_URI = DB_URI#===============================================================================
# redis 数据库配置
#===============================================================================
import redis
cfg_redis = get_section_dict(file_path=os.path.join(BASE_DIR,"config.ini"),section="redis"
)redis_con = redis.Redis(host=cfg_redis.get("host","localhost"), port=cfg_redis.get("port",6379), db=cfg_redis.get("db",1), decode_responses=cfg_redis.get("decode_responses",False)
)cfg_flask = get_section_dict(file_path=os.path.join(BASE_DIR,"config.ini"),section="flask"
)

apps包中的__init__.py

from flask import Flask
from flask_migrate import Migrate
import config
import pymysql
from exts import db,login_manager,cors
import redis# ===========================================================================
# 这里需要将自定义模型导入到这里
# from apps.models.employee import Employee,Attendance
# from apps.models.user import Userdef create_app(config_class=config):app = Flask(__name__)app.config.from_object(config_class)# 初始化扩展db.init_app(app)migrate = Migrate(app, db)cors.init_app(app=app,resources={r"/api/*": {"origins": "*"}},supports_credentials=True)login_manager.init_app(app)login_manager.login_view = 'api.login'# @login_manager.user_loader# def load_user(user_id: str):#     return User.query.get(int(user_id))# 蓝图注册# from app.routes.main import main_bp# from app.routes.api import api_bp# app.register_blueprint(main_bp)# app.register_blueprint(api_bp,url_prefix='/api')# 创建数据库表 - 在设置了URI后才创建with app.app_context():db.create_all()pymysql.install_as_MySQLdb()return app 

main.py

from apps import create_appapp = create_app()if __name__ == '__main__':app.run(debug=True)

config.ini

[mysql]
# 连接数据库基本参数
host        = localhost
port        = 3306
user        = root
password    = 123456
database    = databaseName
charset     = utf8mb4# 可选:连接池/超时配置
connect_timeout = 10
pool_size       = 5[redis]
host             = localhost
port             = 6379
db               = 1
decode_responses = False[flask]
APP_NAME = 'flask_app'

utils.configUtils.py

import configparser
from typing import Dict
from typing import Dict, Any
import configparser
import re,random
from app.models.employee import BehaviorTypeEnum,Behavior
from datetime import datetime,timedelta
import pytzdef get_section_dict(file_path: str,section: str,encoding: str = 'utf-8'
) -> Dict[str, Any]:"""从指定的 ini 文件中读取一个区块,将该区块的 key/value 封装为字典返回,并自动将字符串形式的布尔值、整数和浮点数转换为相应的 Python 类型。:param file_path: ini 文件路径:param section: 要读取的区块名称:param encoding: 文件编码,默认为 'utf-8':return: 区块键值对字典,value 类型可能为 str, int, float, 或 bool:raises KeyError: 如果指定区块在文件中不存在"""config = configparser.ConfigParser()config.optionxform = str  # 保持 key 的大小写config.read(file_path, encoding=encoding)if section not in config:raise KeyError(f"Section '{section}' not found in '{file_path}'.")raw = config[section]parsed: Dict[str, Any] = {}for key, value in raw.items():v = value.strip()low = v.lower()# 布尔类型if low in ('true', 'yes', 'on'):parsed_val: Any = Trueelif low in ('false', 'no', 'off'):parsed_val = False# 整数elif re.fullmatch(r'-?\d+', v):parsed_val = int(v)# 浮点数elif re.fullmatch(r'-?\d+\.\d+', v):parsed_val = float(v)# 其余保持字符串else:parsed_val = vparsed[key] = parsed_valreturn parsed

utils.restful.py

# Restful API
from flask import jsonifyclass HttpCode(object):# 响应正常ok = 200# 没有登陆错误unloginerror = 401# 没有权限错误permissionerror = 403# 客户端参数错误paramserror = 400# 服务器错误servererror = 500def _restful_result(code, message, data):return jsonify({"message": message or "", "data": data or {}, "code": code})def ok(message=None, data=None):return _restful_result(code=HttpCode.ok, message=message, data=data)def unlogin_error(message="没有登录!"):return _restful_result(code=HttpCode.unloginerror, message=message, data=None)def permission_error(message="没有权限访问!"):return _restful_result(code=HttpCode.paramserror, message=message, data=None)def params_error(message="参数错误!"):return _restful_result(code=HttpCode.paramserror, message=message, data=None)def server_error(message="服务器开小差啦!"):return _restful_result(code=HttpCode.servererror, message=message or '服务器内部错误', data=None)

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

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

相关文章

数据结构--2:ArrayList与顺序表

1.顺序表的创建 2.常见操作 3.遍历 4.扩容机制 5.例子1.顺序表的创建在集合框架中,ArrayList是⼀个普通的类,实现了List接口,具体框架图如下:2.常见操作代码…

【Kubesphere】K8s容器无法访问内网xx网络问题

问题遇到的现象和发生背景 Kubesphere中运行的一个容器,可以ping通我们公司内网网段172.16.XX.XX,但是在容器内无法ping通192.168.5.XX,但是我在宿主机是可以ping通192.168.5.XX,这个192.168.5.XX是通过xx设备接进来的&#xff0c…

【开发语言】Groovy语言:Java生态中的动态力量

博客目录一、Groovy 的诞生与发展二、核心特性深度解析1. 与 Java 的无缝集成2. 动态类型与可选静态类型3. 强大的集合操作三、Groovy 在实际开发中的应用场景1. 构建自动化(Gradle)2. 测试开发(Spock 框架)3. 脚本任务自动化四、…

Obsidian 1.9.10升级

概述 Obsidian发布了更新版本1.9.10,是一次比较大的升级,尤其是增加了一些以前没有的核心插件,尤其是重磅的数据库功能。虽然可能还是比较初期,但是这意味着OB还是往更好的方向进化了。 本文以一些目前的视频教程加自己的实际上手…

内容审计技术

一、 内容审计需求背景1.网络安全法要求明确责任人:制定内部安全管理制度和操作规程,落实安全保护责任。监测、记录并保留日志:采取监测、记录网络运行状态、网络安全事件的技术措施,并按照规定留存相关网络日志不少于六个月。采取…

反序列化漏洞

php反序列化 1.什么是序列化和反序列化 office word是程序 doc/docx是数据 保存word文件:程序--保存(序列化)-->数据文件 打开word文件:程序--加载数据文件-->还原(反序列化) 游戏存档:角色等级,任务,人物坐…

Lecture 4 Mixture of experts课程笔记

什么是MoE?用(多个)大型前馈网络和一个选择器层取代大型前馈网络。你可以在不影响浮点运算次数的情况下增加专家数量。 MoE受欢迎的原因 相同的浮点运算次数,更多的参数表现更好训练混合专家模型(MoEs)速度更快训练混…

微服务架构的演进:从 Spring Cloud Netflix 到云原生新生态

过去十年,Spring Cloud 凭借 Netflix 全家桶(Eureka、Ribbon、Hystrix、Zuul 等)几乎成为 Java 微服务的事实标准。但随着这些核心组件逐步停止更新或进入维护模式,微服务架构正经历一场深刻的演进。新的微服务架构更加注重 云原生兼容性、社区活跃度、企业级稳定性和低运维…

网络流量分析——基础知识

文章目录所需技能和知识TCP/IP 堆栈和 OSI 模型基本网络概念常用端口和协议IP 数据包和子层的概念协议传输封装环境与设备常见的流量分析工具BPF 语法执行网络流量分析NTA工作流程NTA工作流程网络 - 第 1-4 层OSI / TCP-IP 模型寻址机制MAC地址IP 寻址IPv4IPv6IPv6 寻址类型IPv…

ansible playbook 实战案例roles | 实现基于 IHS 的 AWStats 访问监控系统

文章目录一、核心功能描述二、roles内容2.1 文件结构2.2 主配置文件2.3 tasks文件内容三、files文件内容四、关键价值免费个人运维知识库,欢迎您的订阅:literator_ray.flowus.cn 一、核心功能描述 这个 Ansible Role 的核心功能是:​实现 ​…

DELL服务器 R系列 IPMI的配置

1、iDRAC功能默认都是关闭,需要在BIOS面启用,首先重启计算机,按F2然后进入BIOS,选择iDRAC Setting进行iDRAC配置 2、重置一下idrac卡-重置才能恢复默认密码 3、进入iDRAC Setting之后,选择设置网络Network 4、启用iDRA…

模式组合应用-桥接模式(一)

写在前面Hello,我是易元,这篇文章是我学习设计模式时的笔记和心得体会。如果其中有错误,欢迎大家留言指正!文章为设计模式间的组合使用,涉及代码较多,个人觉得熟能生巧,希望自己能从中学习到新的…

【clion】visual studio的sln转cmakelist并使用clion构建32位

我想在linux上运行,所以先转为cmake工程 例如可以把exe mfc 部分不构建,这样ubuntu就不用移植。 先转cmakelist,而后clion完成win32的构建,与vs构建对比,验证脚本正确性。 Vcxproj2CMake https://github.com/gns333/Vcxproj2CMake cmakeconverter https://github.com/pave…

MySQL之分区功能

序言 随着业务发展,我们维护的项目数据库中的数据可能会越来越大,那么单张表的数据变多后,接口查询效率可能会变慢,那我们就直接照抄大厂常见的分库分表吗?—— 当然不是的,分库分表不是万能的。 分库分表…

java_spring boot 中使用 log4j2 及 自定义layout设置示例

1. log4j2对比 原始Logback 优势 对于 Spring Boot 3.x,Logback 是默认日志框架,但在高并发、异步日志场景下,Log4j2 通常表现更优。当业务百万级用户、微服务、日志量大时: ✅ 1. Logback(默认 Spring Boot 集成&am…

记录Webapi Excel 导出

文章目录1、helper2、control3、前端 axios记录webapi excel 导出File示例.NET8.0 NPOI2.731、helper using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.Data; using System.IO; /// <summary> /// 导出EXCEL /// </summary> public class Exce…

VPS服务器安全审计方案:从风险评估到防护实施

随着云计算技术的快速发展&#xff0c;VPS服务器已成为企业信息化建设的重要基础设施。随之而来的安全威胁也日益增多&#xff0c;如何通过专业的安全审计方案保障VPS服务器的稳定运行成为关键课题。本文将系统阐述从漏洞扫描到应急响应的全周期安全审计实施策略&#xff0c;帮…

libmicrohttpd 入门

libmicrohttpd 是一个小型的 C 库&#xff0c;用于在项目中嵌入 HTTP 服务器功能。它设计简单、轻量级&#xff0c;适合需要 HTTP 接口但不想要大型 Web 服务器开销的应用程序。 安装 libmicrohttpd Linux 系统 在基于 Debian/Ubuntu 的系统上&#xff1a; bash sudo apt-…

【网络】使用 DNAT 进行负载均衡时,若未配置配套的 SNAT,回包失败

【网络】iptables 1 概念 【网络】iptables 2 查看规则 【网络】使用 DNAT 进行负载均衡时&#xff0c;若未配置配套的 SNAT&#xff0c;回包失败 【网络】回包路由原理 使用 DNAT 进行负载均衡时&#xff0c;若未配置配套的 SNAT&#xff0c;后端服务器将直接回包给客户端&am…

深入解析GCC:从编译原理到嵌入式底层实战

继续更新编译器底层系列&#xff01;&#xff01;&#xff01;硬核C语言的屠龙之术&#xff1a;从GCC到汇编的底层征途&#xff08;一&#xff09;总纲&#xff1a; 恭喜你&#xff0c;决定踏上这条通往嵌入式大佬的硬核之路。这条路的起点&#xff0c;不是C语言的语法书&#…