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

Flask 最佳实践(二)

Flask是一个轻量级而灵活的Web框架,提供了足够的自由度让开发者根据项目的需求进行定制。然而,为了在大型项目中保持代码的可维护性和可扩展性,建议采用以下一些建议的最佳实践。
在上一篇博客中,讲述了项目结构、蓝图相关的最佳实践,下面再讲讲其他的。

1. 配置管理

应用总是需要一定的配置的。根据应用环境不同,会需要不同的配置。比如开关 调试模式、设置密钥以及其他依赖于环境的东西。

Flask 的设计思路是在应用开始时载入配置。可以在代码中直接硬编码写入配 置,对于许多小应用来说这不一定是一件坏事,但是还有更好的方法。

不管使用何种方式载入配置,都可以使用 Flask 对象的 config 属性来操作配置的值。 Flask 本身就使用这个对 象来保存一些配置,扩展也可以使用这个对象保存配置。同时这也是保存配置 的地方。

使用app.config

Flask提供了一个config对象,它实质上是一个字典的子类,可以像字典一样操作:

app = Flask(__name__)
app.config['TESTING'] = True

某些配置值还转移到了 Flask 对象中,可以直接通过 Flask 来操作:

app.testing = True

一次更新多个配置值可以使用 dict.update() 方法:

app.config.update(TESTING=True,SECRET_KEY='---'
)
使用配置对象

在Flask中,可以创建一个配置对象,其中包含应用的配置参数。这可以是一个Python类,类的属性定义了各种配置选项。

# config.pyclass Config:DEBUG = FalseSECRET_KEY = 'your_secret_key'SQLALCHEMY_DATABASE_URI = 'your_database_uri'class DevelopmentConfig(Config):DEBUG = Trueclass ProductionConfig(Config):SQLALCHEMY_DATABASE_URI = 'your_production_database_uri'

然后,在应用中通过指定一个配置类来加载相应的配置。例如,使用create_app工厂函数:

# __init__.pyfrom flask import Flask
from config import Configdef create_app(config_class=Config):app = Flask(__name__)app.config.from_object(config_class)return app
使用 Python 配置文件

如果把配置放在一个单独的文件中会更有用。理想情况下配置文件应当放在应用 包之外。针对不同的部署使用特定的配置。

常见用法如下:

app = Flask(__name__)
app.config.from_object('yourapplication.default_settings')
app.config.from_envvar('setting_file_env')

首先从 yourapplication.default_settings 模块载入配置,然后根据 setting_file_env 环境变量所指向的文件的内容重载配置的 值。在启动服务器前,这个环境变量可以在终端中设置:

export setting_file_env=/path/to/settings.cfg

配置文件本身实质是 Python 文件。只有全部是大写字母的变量才会被配置对象 所使用。因此需要确保使用大写字母。

settings.cfg

SECRET_KEY = '---'
使用数据文件

也可以使用 from_file() 从其他格式的文件来加载配置。 例如:

#从 TOML 文件加载
app.config.from_file("config.toml", load=toml.load)#从 JSON 文件加载:
app.config.from_file("config.json", load=json.load)
使用环境变量

除了使用环境变量指向配置文件之外,你可能会发现直接从环境中控制配置值很 有用(或者很有必要)。 Flask 可以使用 from_prefixed_env() 来指定载入以特定前缀开头的所有 环境变量。

在启动服务器前,可以在终端中设置环境变量:

export FLASK_SECRET_KEY="---"
export FLASK_MAIL_ENABLED=false

缺省的前缀是 FLASK_ 。前缀可以通过 from_prefixed_env() 的 prefix 参数来变更。

变量在解析的时候会优先转换为更特殊的数据类型,如果无法转换为其他类型, 那么最后会转换为字符串类型。变量解析缺省使用 json.loads() ,因此 可以使用任何合法的 JSON 值,包括列表和字典。解析的行为是可以自定义的, 通过 from_prefixed_env() 的 loads 参数可以自定 义解析的行为。

当使用缺省的 JSON 解析时,只有小写的 true 和 false 是合法的布尔 值。所有非空的字符在 Python 中都会被视为 True 。

使用双下划线( __ )可以设置嵌套的字典,如果嵌套字典的中间键不存 在话会被初始化为空字典。

$ export FLASK_MYAPI__credentials__username=user123
app.config[“MYAPI”][“credentials”][“username”] # Is “user123”
在 Windows 系统下,环境变量总是大写的,因此上面的例子最终会变成 MYAPI__CREDENTIALS__USERNAME 。

2.工厂函数

工厂函数是一种创建和配置Flask应用的模式,它有助于将应用的创建与配置分离,使应用更易于测试和维护。通过使用工厂函数,你可以在不同的配置下创建多个应用实例,例如在开发、测试和生产环境下使用不同的配置。

以下是关于如何使用工厂函数的详细说明:

创建工厂函数

在主应用目录下的__init__.py文件中创建工厂函数:

# __init__.pyfrom flask import Flask
from config import Configdef create_app(config_class=Config):app = Flask(__name__)app.config.from_object(config_class)# 注册蓝图、扩展等其他应用组件from app.main_blueprint import main_blueprintfrom app.auth_blueprint import auth_blueprintapp.register_blueprint(main_blueprint)app.register_blueprint(auth_blueprint)return app

使用工厂函数创建应用

在需要创建应用的地方,例如在app.py或测试脚本中,调用工厂函数创建应用:

# app.pyimport os
from app import create_app
from config import DevelopmentConfig, ProductionConfigenv = os.environ.get('FLASK_ENV', 'dev')
if env == 'dev':# 创建开发环境的应用app = create_app(config_class=DevelopmentConfig)
else:# 创建生产环境的应用app = create_app(config_class=ProductionConfig)

工厂函数的好处

  1. 配置分离: 配置信息独立于应用代码,易于管理和修改。

  2. 可测试性: 可以轻松地在单元测试中创建不同配置的应用实例,以进行更好的测试覆盖。

  3. 可扩展性: 添加新的配置类或修改现有配置类,而不必修改应用实例的创建代码。

  4. 环境隔离: 在不同的环境(开发、测试、生产)中使用不同的配置,确保应用在各个环境中运行正常。

  5. 代码模块化: 将创建应用的逻辑与应用的实际代码分离,使代码更具模块化和可读性。

工厂函数是Flask应用的一种最佳实践,特别是在构建大型或可配置性高的应用时。通过遵循这种模式,可以更好地组织和管理Flask应用。

3.单元测试

在Flask中,进行单元测试是确保应用程序的不同部分按照预期工作的关键步骤之一。通过编写单元测试,可以检查路由、视图函数、模型等组件的正确性,从而确保代码的质量和稳定性。以下是一个关于如何在Flask中进行单元测试的详细说明:

使用python自带的unittest模块

在项目根目录下创建一个 tests 文件夹,用于存放所有的测试文件。测试文件可以按照模块的划分进行组织,例如,test_main.pytest_auth.py等。

# tests/test_main.pyimport unittest
from flask import current_app
from app import create_appclass MainBlueprintTestCase(unittest.TestCase):def setUp(self):self.app = create_app()self.client = self.app.test_client()def test_app_exists(self):self.assertFalse(current_app is None)def test_index_page(self):response = self.client.get('/')self.assertEqual(response.status_code, 200)self.assertIn(b'Welcome', response.data)if __name__ == '__main__':unittest.main()
使用 pytest

pytest是另一个流行的Python测试框架,相对于unittest来说,它具有更简洁的语法和更强大的功能。要使用 pytest,首先需要安装它:

pip install pytest
# tests/test_main.pyfrom app import create_appdef test_app_exists():app = create_app()assert app is not Nonedef test_index_page():app = create_app()client = app.test_client()response = client.get('/')assert response.status_code == 200assert b'Welcome' in response.data

然后在项目根目录运行测试:

pytest
使用 Flask-Testing 扩展

Flask-Testing是一个提供Flask应用测试的扩展,它简化了许多测试过程,并提供了更方便的API。

pip install Flask-Testing
# tests/test_main.pyfrom flask_testing import TestCase
from app import create_appclass MainBlueprintTestCase(TestCase):def create_app(self):return create_app()def test_index_page(self):response = self.client.get('/')self.assert200(response)self.assertIn(b'Welcome', response.data)
运行测试

在项目根目录中,可以运行下面的命令来执行所有的测试:

python -m unittest discover tests

或者,如果使用了pytest

pytest

通过持续集成(CI)工具(如Travis CI、Jenkins等),可以自动运行测试,确保每次代码变更都没有破坏应用的功能。

相关文章:

Flask 最佳实践(二)

Flask是一个轻量级而灵活的Web框架,提供了足够的自由度让开发者根据项目的需求进行定制。然而,为了在大型项目中保持代码的可维护性和可扩展性,建议采用以下一些建议的最佳实践。 在上一篇博客中,讲述了项目结构、蓝图相关的最佳实…...

【MATLAB源码-第93期】基于matlab的白鲸优化算法(BWO)和鲸鱼优化算法(WOA)机器人栅格路径规划对比。

操作环境: MATLAB 2022a 1、算法描述 白鲸优化算法(BWO) 白鲸优化算法是受到白鲸捕食和迁徙行为启发的一种算法。其主要特点和步骤包括: 1. 搜索食物(全局搜索):算法模仿白鲸寻找食物的行为。…...

nodejs微信小程序+python+PHP在线购票系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...

卷积神经网络训练情感分析

文章目录 1 CNN在自然语言的典型应用2 代码解释3 建议 1 CNN在自然语言的典型应用 卷积的作用在于利用文字的局部特征,一个词的前后几个词必然和这个词本身相关,这组成该词所代表的词群词群进而会对段落文字的意思进行影响,决定这个段落到底…...

github新建项目

参考链接:Github上建立新项目超详细方法过程 在这里新建一个repositories 接下来就选择相关的信息: 然后create a new就行了 接下来需要创建文件:(同时通过upload上传文件) 每次最多上传100个文件,然后保…...

CRC(循环冗余校验)直接计算和查表法

文章目录 CRC概述CRC名词解释宽度 (WIDTH)多项式 (POLY)初始值 (INIT)结果异或值 (XOROUT)输入数据反转(REFIN)输出数据反转(REFOUT) CRC手算过程模二加减&am…...

【算法思考记录】力扣2952. 需要添加的硬币的最小数量【C++,思路挖掘,贪心与证明】

原题链接 文章目录 需要添加的硬币的最小数量:贪心算法实现题目概述示例分析 关键思路分析贪心算法的优化选择证明案例推演与算法实现 C 实现结论 需要添加的硬币的最小数量:贪心算法实现 题目概述 在这个困难难度的算法题中,我们要解决的…...

用友NC JiuQiClientReqDispatch反序列化RCE漏洞复现

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友 NC JiuQiClientReqDispatch 接口存在…...

Linux:docker镜像的创建(5)

1.基于已有镜像创建 步骤: 1.将原始镜像加入容器并运行 2.在原始镜像中部署各种服务 3.退出容器 4.使用下面命令将容器生成新的镜像 现在我们在这个容器里做了一些配置,我们要把他做成自己镜像 docker commit -m "centos7_123" -a "tarr…...

数据结构与算法-D2D3线性表之顺序表

线性表:包含若干数据元素的一个线性序列,特征如下: 1)对非空表,a0是表头,无前驱; 2)an-1是表尾,无后继; 3)其他元素仅且仅有一个前驱,…...

01_W5500简介

目录 W5500简介: 芯片特点: 全硬件TCPIP协议栈: 引脚分布: W5500简介: W5500是一款高性价比的以太网芯片,其全球独一无二的全硬件TCPIP协议栈专利技术,解决了嵌入式以太网的接入问题,简单易用&#xff…...

异常 Exception 练习题 (未完成)

异常 Exception 练习题 try-catch异常处理1234 异常1(没有自己写)234 try-catch异常处理 1 class Exception01 {public static int method() {try {String[] names new String[3];//String[]数组if (names[1].equals("tom")) {//NullPointe…...

Linux系统编程:并发与信号总结

并发 并发是指两个或多个同时独立进行的活动。在计算机系统中,并发指的是同一个系统中多个独立活动同时进行,而非依次进行。 并发在计算机系统中的表现: 一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是…...

Jmeter 接口-加密信息发送(一百九十九)

方式1:使用函数助手 比如MD5加密方式: 如图,需要对${user}进行MD5加密 1、打开函数助手,找到MD5,输入需要加密的值 2、将${__MD5(${user},)}放到请求中 3、查看请求,请求成功 方式2:导入jar包…...

微信小程序nodejs+vue+uniapp视力保养眼镜店连锁预约系统

作为一个视力保养连锁预约的网络系统,数据流量是非常大的,所以系统的设计必须满足使用方便,操作灵活的要求。所以在设计视力保养连锁预约系统应达到以下目标: (1)界面要美观友好,检索要快捷简易…...

掌握Vue侦听器(watch)的应用

文章目录 🍁watch 的优缺点🍂Watch 优点🍂Watch 缺点 🍁watch 的用法🍂对象式 watch🍂函数式 watch 🍁代码示例🍂监听基本数据类型🍂监听复杂数据类型(Object…...

SAP-PP:PP顾问管理系统的相关建议

本博客将探讨生产计划领域的控制要点。这将有助于减少仓库库存不准确情况,因为库存不准确会导致实物库存、发货、成本核算和计划方面出现许多效率低下的问题。 在物料主数据关键字段中,必须配置计划交货时间、GR处理时间、内部生产时间、计划交货时间&a…...

Unity资源路径与读取

Unity资源路径有: 1、StreamingAssets:只读,一般用于存放应用程序运行时需要加载的资源文件,可以通过Application.streamingAssetsPath来获取。 2、PersistentDataPath:可读写,一般用于存放应用程序运行时…...

“大+小模型”赋能油气行业高质量发展

近日,中国石油石化科技创新大会暨新技术成果展在北京盛大举行,九章云极DataCanvas公司携油气行业一站式AI综合解决方案重磅亮相,充分展示了公司助推油气行业实现AI规模化应用深厚的AI技术实力和领先的AI应用水准,赢得了行业专家和…...

【win32_004】字符串处理函数

StringCbPrintf 函数 (strsafe.h):格式化字符串 STRSAFEAPI StringCbPrintf([out] STRSAFE_LPSTR pszDest,//目的缓冲区 LPSTR指针或者数组[in] size_t cbDest,//目的缓冲区大小[in] STRSAFE_LPCSTR pszFormat,//格式 例如: TEXT("%d&…...

如果不小心修改了按钮的名字并且忘记了原名字

出现上述情况,可以右边点击转到代码,注释掉问题行,此页的设计界面就恢复了。...

opencv阈值处理

阈值处理 二值化 自适应阈值 OTSU二值化...

html之JS

1、JS的引入 <!-- 内嵌 --><!-- <script>alert(4)</script> --><!-- 外引 --><!-- 内嵌和外引同时有的时候&#xff0c;内嵌被覆盖 --><script src"js/index.js" defer></script>//defer 延迟执行 2、js的变量使用…...

SQL Server的安装和首个库的创建

一、熟悉SQL Server的安装环境&#xff1b; 1.安装Microsoft的数据库管理系统SQL Server 2022 先把SQL Server 2022下载好后进行解压后出现以下界面然后点击基本进行安装 然后会出现以下界面&#xff1a; 一步步按照提示往下走即可&#xff0c;把SQL Server 2022安装完成后再…...

STM32下载程序的五种方法

刚开始学习 STM32 的时候&#xff0c;很多小伙伴满怀热情买好了各种设备&#xff0c;但很快就遇到了第一个拦路虎——如何将写好的代码烧进去这个黑乎乎的芯片&#xff5e; STM32 的烧录方式多样且灵活&#xff0c;可以根据实际需求选择适合的方式来将程序烧录到芯片中。本文将…...

基于springboot + vue大学生竞赛管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…...

【详解】Spark数据倾斜问题由基础到深入详解-完美理解-费元星

数据倾斜定义&#xff1a;顾名思义&#xff0c;就是大量相似或相同数据聚集在一个块的节点里&#xff0c;导致计算和资源分配不均导致的计算缓慢&#xff08;长尾&#xff09;问题。 数据倾斜原因&#xff1a; count(distinct field) group by NULL 空值 Shuffle (概率最…...

xss漏洞后端进行html消毒

import org.jsoup.Jsoup;public static String sanitizeHtml(String input) {// 使用 Jsoup 消毒 HTMLreturn Jsoup.clean(input, Safelist.relaxed());}public static void main(String[] args) {String userInput "<p><script>alert(1)</script>Safe…...

[论文精读]利用大语言模型对扩散模型进行自我修正

本博客是一篇最新论文的精读&#xff0c;论文为UC伯克利大学相关研究者新近(2023.11.27)在arxiv上上传的《Self-correcting LLM-controlled Diffusion Models》 。 内容提要: 现有的基于扩散的文本到图像生成模型在生成与复杂提示精确对齐的图像时仍然存在困难,尤其是需要数值和…...

CTF特训日记day(4-6)

来复现一下2022QWB决赛的RDP题目 这两天腰疼去了趟医院 题目要求我们攻击XRDP程序&#xff0c;从而达到本地提权的效果。 首先观察XRDP程序的版本信息 rootRDP:/home/rdp/Desktop# xrdp-sesman -version xrdp-sesman 0.9.18The xrdp session managerCopyright (C) 2004-2020…...

如何设计制作企业网站/手机怎么制作网站

本文实例讲述了php框架CodeIgniter主从数据库配置方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;CodeIgniter简称CI是最流行的一个php MVC框架之一&#xff0c;本人讲从实际项目使用中写系列实战经验&#xff0c;有别与其他的理论讲解文章&#xff0c;会附上实战…...

建设网站的基本知识/怎样推广一个产品

目录 一、SD卡简介 1、SDIO简介 2.SD卡物理结构 二、STM32CubeMX建立工程 1.配置管脚 2.点击FATFS&#xff0c;勾选User-defined 3.SYS配置 4.GPIO配置 5.SPI1配置 6.USART1配置 7.时钟树配置 8.修改堆栈大小 三、程序编写 1.源代码下载 2.修改接口里面的内容映…...

pytson做网站安全吗/seo外链工具

一、昨天干了什么&#xff1f; 对我们最后要发布的版本不断修复&#xff0c;将软件发布到蒲公英开放平台&#xff0c;集成蒲公英SDK&#xff0c;新增摇一摇反馈的功能和版本更新功能。 二、今天准备做什么&#xff1f; 向同学们宣传我们的软件&#xff0c;然后给我们提供反馈&a…...

中国化工第九建设公司网站/外链大全

1 背景 使用spring boot整合redis spring boot版本为 2.0.6.RELEASE 服务部署在Linux服务器 2 解决方案 登录自己服务部署的Linux服务器 首先查看自己主机名 hostname 输出 查看服务器配置文件 vim /etc/hosts加入如下配置即可...

深圳网站建设哪些/今日刚刚发生新闻事件

文章目录 1)、为什么要自定义UITabBarController2)、重复代码的抽取3)、统一所有控制器导航栏左上角和右上角的内容4)、"duplicate symbol _OBJC_METACLASS_$_类名 in:"错误的解决方案5)、创建UIBarButtonItem的代码为什么放在UIBarButtonItem分类中最合适?6)iOS开…...

星裕建设网站/seo岗位有哪些

突然想写写自己的伞。 研究生三年使用的伞。 第一把伞&#xff0c;是大学时候就有的伞。时至今日&#xff0c;我还清晰的记得它的来路&#xff0c;那正是我暑假回学校下火车的那天&#xff0c;西安下着大雨&#xff0c;而我&#xff0c;忘了带伞&#xff0c;从出站口大妈手里&a…...