Python框架篇(6):FastApi-配置管理

@提示: 微信搜索【猿码记】回复 【fastapi】即可获取源码信息~

在这一篇文章中,对fastapi框架和pydantic进行了升级,然后就是各种不兼容,以后再也不敢轻易升级....

  • pydantic:从 1.10.11升级到 2.5.2,这里有坑,里面有很多属性都给删除了,而且升级 pydantic后, fastapi也必须升级,否则底层使用的 pydantic会有问题;
  • fastapi: 从 0.94.0升级到 0.105.0

1.介绍

在大型项目中,良好的配置管理是确保系统可维护性和灵活性的关键,FastAPI官方文档在设置和环境变量: https://fastapi.tiangolo.com/zh/advanced/settings/#_1介绍了两种方式;

1.1 方式一:export

首先使用关键词export设置配置值,如下:

export APP_NAME="FastAPI学习使用"

然后在代码中使用os.getenv("变量名","默认值")获取

import os

appName = os.getenv("APP_NAME""")
print(appName)

上述方式,适合配置比较少的情况,常用的还是下面方式

1.2 方式二: .env+pydantic

在日常工作中比较常用的还是通过.env来设置配置,并把内容映射到pydantic对应的模型上,方便读取和管理,下面以这个方式为主进行学习。

2. 安装依赖

2.1 安装python-dotenv

python-dotenv 是一个Python库,用于从文本文件中加载环境变量

$ pip install python-dotenv

2.2 安装pydantic_settings

$ pip install pydantic_settings

3.编写配置

3.1 编写.env

# -------- 服务配置信息 --------
APP_ENV=local
APP_NAME=AI学习
APP_PORT=8080
APP_HOST=0.0.0.0
APP_VERSION=v1.0.0
APP_DEBUG=true# -------- jwt配置 --------
# 是否开启jwt
JWT_ENABLE=false
# 秘钥
JWT_SECRET_KEY=abcd12345@abcdef
# 算法
JWT_ALGORITHM=HS256
# 过期时间(单位:分钟)
JWT_EXPIRED=60
# 签发人
JWT_ISS=猿码记
# 不校验JWT token的路由
JWT_NO_CHECK_URIS=/,/apidoc,/openapi.json,/api/user/login,/favicon.ico# -------- 数据库配置 --------
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=root
DB_PASSWORD=root
DB_DATABASE=test# -------- redis配置 --------
REDIS_DSN=redis://0.0.0.0:6379/0

3.2 编写配置模型

在包app/config下,创建文件app_config.py,内容如下:

from pydantic import RedisDsn
from pydantic_settings import BaseSettings


class AppConfigSettings(BaseSettings):
    """应用配置"""
    app_name: str = "FastAPI学习"
    app_port: int = 8080
    app_env: str = "dev"
    app_debug: bool = False
    """jwt配置"""
    jwt_enable: bool = False
    jwt_secret_key: str = "12345789@98765431"
    jwt_algorithm: str = "HS256"
    jwt_expired: int = 30
    jwt_iss: str = "猿码记"
    jwt_no_check_uris: str = ""
    """数据库配置"""
    db_host: str
    db_port: int
    db_user: str
    db_password: str
    db_database: str
    """redis配置"""
    redis_dsn: RedisDsn = None

4.使用

4.1 创建配置实例

在文件app/config/__init__.py编写代码如下

from dotenv import load_dotenv
from .validate_template_config import validateChineseDict, keyErrorChineseDict
from .app_config import *

# 加载 .env 文件
load_dotenv()
# 实例化配置模型
appSettings = AppConfigSettings()

4.2 使用示例

main.py中使用

...
# 导入配置
from app.config import appSettings
...
if __name__ == "__main__":
    # 打印配置
    print(appSettings)
    # 这里使用端口是.env 中配置的
    uvicorn.run(server, host="0.0.0.0", port=appSettings.app_port)

4.3 使用优化

根据官方文档介绍,如果通过上面方式使用配置,每次导入都会创建一个配置实例,而且从磁盘中读取文件通常是一项耗时的(慢)操作,所以尽可能的复用这个配置实例。文档推荐使用@lru_cache 装饰器,它只有在第一次调用它时,才会创建配置实例;

根据文档,我们修改app/config/__init__.py 代码,修改后如下:

from functools import lru_cache
from dotenv import load_dotenv
from .validate_template_config import validateChineseDict, keyErrorChineseDict
from .app_config import *

@lru_cache
def getAppConfig() -> AppConfigSettings:
    # 加载 .env 文件,dotenv_path 变量默认是.env
    load_dotenv()
    # 实例化配置模型
    return AppConfigSettings()


# 获取配置
appSettings = getAppConfig()

4.4 lru_cache 技术细节

具体说明,可查看官方文档: https://fastapi.tiangolo.com/zh/advanced/settings/#lru_cache

@lru_cache 装饰器,相当于是缓存了函数结果,当相同入参请求时,返回的是缓存结果,不相同时则会重新计算结果,以下是官方给的代码示例和配套讲解图

a.代码示例

@lru_cache
def say_hi(name: str, salutation: str = "Ms."):
    return f"Hello {salutation} {name}"

b.讲解图

alt

5.多环境管理

项目通常都会运行在多个环境,比如开发时运行本地环境、联调时运行测试环境、发布到线上是生产环境;

5.1 多个文件

.env      # 默认为本地开发环境
.env.test # 测试环境
.env.prod # 生产环境

5.2 修改创建配置实例

在文件app/config/__init__.py编写代码如下

import os
from functools import lru_cache
import argparse
from dotenv import load_dotenv
from .validate_template_config import validateChineseDict, keyErrorChineseDict
from .app_config import *

@lru_cache
def getAppConfig() -> AppConfigSettings:
    """ 获取项目配置 """
    # 解析命令行参数
    parseCliArgument()
    # 读取运行环境
    runEnv = os.environ.get("APP_ENV""")
    print("运行环境: ", runEnv)
    # 默认加载.env
    envFile = ".env"
    # 运行环境不为空加载 .env 文件
    if runEnv != "":
        # 当是其他环境时,如测试环境: 加载 .env.test 正式环境: 加载.env.prod
        envFile = f".env.{runEnv}"
    # 加载配置
    load_dotenv(envFile)
    # 实例化配置模型
    return AppConfigSettings()


def parseCliArgument():
    """ 解析命令行参数 """
    import sys
    if "uvicorn" in sys.argv[0]:
        # 使用uvicorn启动时,命令行参数只能按照uvicorn的文档来,不能传自定义参数,否则报错
        return
    # 使用 argparse 定义命令行参数
    parser = argparse.ArgumentParser(description="命令行参数")
    parser.add_argument("--env", type=str, default="", help="运行环境")
    # 解析命令行参数
    args = parser.parse_args()
    # 设置环境变量
    # uvicorn模式启动,读取的.env*里面的APP_ENV
    os.environ["APP_ENV"] = args.env


# 创建配置实例
appSettings = getAppConfig()

@注意: 这里使用argparse来接收命令行参数,根据不同的参数运行不通的环境

5.3 运行示例

a.使用python启动

# 默认环境 .env
$ python main.py 

#
 测试环境 .env.test
$ python main.py --env=test

#
 生产环境 .env.prod
$ python main.py --env=prod

b.使用uvicorn启动

# 默认环境 .env
$  uvicorn main:server --port 8000 --env-file .env 

#
 测试环境 .env.test
$ uvicorn main:server --port 8001 --env-file .env.test

#
 生产环境 .env.prod
$ uvicorn main:server --port 8002 --env-file .env.test

@注意: 使用uvicorn启动时,命令行参数只能按照uvicorn的文档来,不能传自定义参数

本文由 mdnice 多平台发布

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

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

相关文章

蓝凌OA getLoginSessionId.html 信息泄露漏洞

文章目录 产品简介漏洞概述指纹识别漏洞利用修复建议 产品简介 蓝凌核心产品EKP平台定位为新一代数字化生态OA平台,数字化向纵深发展,正加速构建产业互联网,对企业协作能力提出更高要求,蓝凌新一代生态型OA平台能够支撑办公数字化…

SpringCloud微服务 【实用篇】| Docker镜像、容器、数据卷操作

目录 一:Docker基本操作 1. 镜像操作 镜像相关命令 2. 容器操作 容器相关命令 3. 数据卷(容器数据管理) 数据卷 操作数据卷 挂载数据卷 挂载的方式区别 前些天突然发现了一个巨牛的人工智能学习网站,通俗易懂&#xff0…

【数据可视化】Pyecharts的实际使用

Pyecharts的实际使用 前言正文环境分析Prometheus数据处理Gauge图Bar图-横向如何整合进Flask中 附录 前言 一个多月前参加公司的一个产品会的时候,有和同事聊到日常巡检报表的一些东西,现在虽然项目上搭建的有监控平台、数据稽核平台、调度平台等业务系…

JavaWeb 学生信息管理系统

介绍 ServletMysqlJdbcjQuery 实现学生信息管理系统 学生 班级 教师 系统设置 登陆 软件架构 软件架构说明 基于ServletMysqlJdbcjQuery 实现学生信息的增删改查功能 文件目录声明 src/dao 数据库的增删改查功能src/filter 网页的过滤拦截功能src/model 登陆的实体对象信息…

Gazebo11更新安装

ROS Melodic版本安装的是Gazebo9,Gazebo 最新版本是11 dpkg -l | grep gazebo 出现的是 gazebo9 相关的插件,需要卸载全部插件。 sudo apt-get remove gazebo9 gazebo9-common gazebo9-plugin-base libgazebo9:amd64 libgazebo9-dev:amd64 ros-melodic…

从账户取款和存款的操作

public class Account {private double balance;public Account(double balance){super();this.balancebalance;}public Account(){super();}public void withdraw(double money) throws NotFullBalanceException{//取款if(money<balance){balance - money;}else{throw new …

flink 读取 apache paimon表,查看source的延迟时间 消费堆积情况

paimon source查看消费的数据延迟了多久 如果没有延迟 则显示0 官方文档 Metrics | Apache Paimon

Ring Co-XOR encryption based reversible data hiding for 3D mesh model

期刊&#xff1a;Signal Processing 作者&#xff1a;Lingfeng Qu et al. -- 摘要&#xff1a; 加密域可逆数据隐藏被广泛应用于云存储数字媒体的内容安全、隐私保护和便捷管理。然而&#xff0c;RDH-ED技术在三维网格模型载体中的应用研究仍处于起步阶段。为解决现有针对三…

美化Pandas数据图表

二、数据条显示 Excel条件格式里&#xff0c;有一个数据条显示方式&#xff0c;用以可视化表达数据大小。 Pandas Style方法中也有数据条的表达形式&#xff0c;用df.style.bar来实现。 还是用前面人口数据的例子&#xff0c;我们来看下如何操作数据条。 import pandas as …

初探 Reactor、Proactor 线程模型与 BIO、AIO、NIO

1 前言 工作中或者是技术上经常会遇到 I/O 、线程模型相关的问题&#xff0c;以及同步、异步、阻塞、非阻塞等各种基础问题&#xff0c;之前上学时候的概念认知总是模糊的&#xff0c;一知半解。趁这次了解希望能够更加深入的去了解这方面的知识&#xff0c;于是有了接下来这篇…

(7)nacos集群搭建方法-有状态负载

前期准备 1.准备好nacos镜像文件,上传至镜像仓库: 2.创建自己集群下-命名空间下的有状态负载: 3.填写工作负载名称、设置实例数量、选择自己的命名空间: 4.选择镜像(目前最新的是2.2.3):

yolov5单目测距+速度测量+目标跟踪(算法介绍和代码)

要在YOLOv5中添加测距和测速功能&#xff0c;您需要了解以下两个部分的原理&#xff1a; 单目测距算法 单目测距是使用单个摄像头来估计场景中物体的距离。常见的单目测距算法包括基于视差的方法&#xff08;如立体匹配&#xff09;和基于深度学习的方法&#xff08;如神经网…

[自动化运维工具]ansible简单介绍和常用模块

ansible 源操作主机功能 自动化运维&#xff08;playbook剧本yaml&#xff09; 是基于python开发的一个配置管理和应用部署工具&#xff0c;在自动化运维中&#xff0c;现在还是异军突起 ansible能批量配置&#xff0c;部署&#xff0c;管理上千台主机&#xff0c;类似于xshell…

使用vite搭建项目时,在启动vite后,浏览器显示页面:找不到localhost的网页

现象 在使用前端工具vite&#xff08;版本5&#xff09;&#xff0c;搭建vue3项目时&#xff0c;启动vite&#xff0c;浏览器显示页面&#xff1a;找不到localhost的网页, 起初怀疑是 未加参数 --host0.0.0.0,导致&#xff0c;后加上该参数后问题依旧 解决 将index.html页面…

中国的下一个风口:低代码开发

“中国的下一个风口是什么&#xff1f;低代码&#xff1f;你赞同吗&#xff1f;” 可以肯定的是&#xff0c;企业想站上未来产业的风口&#xff0c;”数字化“是必经之路。而低代码是企业向制高点突进的手段。产业的风口&#xff0c;就是产业发展的趋势&#xff0c;只有尽力站上…

Makefile的使用

在Linux中使用 make 命令来编译程序&#xff0c;特别是大程序&#xff1b;而 make 命令所执行的动作 依赖于 Makefile 文件。以下是最简单的Makefile文件&#xff1a; 首先&#xff0c;包含如下文件&#xff1a; Makefile文件内容如下所示&#xff1a; 然后&#xff0c;直接执行…

【程序】STM32 读取光栅_编码器_光栅传感器_7针OLED

文章目录 源代码工程编码器基础程序参考资料 源代码工程 源代码工程打开获取&#xff1a; http://dt2.8tupian.net/2/28880a55b6666.pg3这里做了四倍细分&#xff0c;在屏幕上显示 速度、路程、方向。 接线方法&#xff1a; 单片机--------------串口模块 单片机的5V-------…

天猫数据分析-天猫查数据软件-11月天猫平台饮料市场品牌及店铺销量销额数据分析

今年以来&#xff0c;饮料是快消品行业中少数保持稳定增长的品类之一。 11月份&#xff0c;饮料市场同样呈现较好的增长态势。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年11月份&#xff0c;天猫平台上饮料市场的销量为2700万&#xff0c;环比增长约42%&#xf…

水经微图Web新版发布

水经微图Web新版已经上线&#xff0c;在该版本中主要新增了态势箭头标绘、文本要素标注和显示网页气泡等功能。 在本文中&#xff0c;我们将为大家分享新增的功能项&#xff0c;以及原有功能作的一些优化等。 当前版本 当前版本号为&#xff1a;1.4.0-beta 如果你发现该版…

linux 操作系统(二)

1、linux用户和权限 1.1、用户分类&#xff1a; 在linux中的用户可以分为两类&#xff0c;一类是root用户&#xff0c;root用户拥有linux操作系统的最大的权限&#xff0c;另外一类就是普通用户&#xff0c;相比于root用户&#xff0c;普通用户的权限受到一定的限制&#xff0…