北京网站建设亿玛酷专注4,东阳网站建设公司,祥云平台英文网站,社交网站开发用到的技术Flask是一个轻量级而灵活的Web框架#xff0c;提供了足够的自由度让开发者根据项目的需求进行定制。然而#xff0c;为了在大型项目中保持代码的可维护性和可扩展性#xff0c;建议采用以下一些建议的最佳实践。 在上一篇博客中#xff0c;讲述了项目结构、蓝图相关的最佳实…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(TESTINGTrue,SECRET_KEY---
)使用配置对象
在Flask中可以创建一个配置对象其中包含应用的配置参数。这可以是一个Python类类的属性定义了各种配置选项。
# config.pyclass Config:DEBUG FalseSECRET_KEY your_secret_keySQLALCHEMY_DATABASE_URI your_database_uriclass 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_classConfig):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, loadtoml.load)#从 JSON 文件加载
app.config.from_file(config.json, loadjson.load)
使用环境变量
除了使用环境变量指向配置文件之外你可能会发现直接从环境中控制配置值很 有用或者很有必要。 Flask 可以使用 from_prefixed_env() 来指定载入以特定前缀开头的所有 环境变量。
在启动服务器前可以在终端中设置环境变量:
export FLASK_SECRET_KEY---
export FLASK_MAIL_ENABLEDfalse
缺省的前缀是 FLASK_ 。前缀可以通过 from_prefixed_env() 的 prefix 参数来变更。
变量在解析的时候会优先转换为更特殊的数据类型如果无法转换为其他类型 那么最后会转换为字符串类型。变量解析缺省使用 json.loads() 因此 可以使用任何合法的 JSON 值包括列表和字典。解析的行为是可以自定义的 通过 from_prefixed_env() 的 loads 参数可以自定 义解析的行为。
当使用缺省的 JSON 解析时只有小写的 true 和 false 是合法的布尔 值。所有非空的字符在 Python 中都会被视为 True 。
使用双下划线 __ 可以设置嵌套的字典如果嵌套字典的中间键不存 在话会被初始化为空字典。
$ export FLASK_MYAPI__credentials__usernameuser123 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_classConfig):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_classDevelopmentConfig)
else:# 创建生产环境的应用app create_app(config_classProductionConfig)工厂函数的好处 配置分离 配置信息独立于应用代码易于管理和修改。 可测试性 可以轻松地在单元测试中创建不同配置的应用实例以进行更好的测试覆盖。 可扩展性 添加新的配置类或修改现有配置类而不必修改应用实例的创建代码。 环境隔离 在不同的环境开发、测试、生产中使用不同的配置确保应用在各个环境中运行正常。 代码模块化 将创建应用的逻辑与应用的实际代码分离使代码更具模块化和可读性。
工厂函数是Flask应用的一种最佳实践特别是在构建大型或可配置性高的应用时。通过遵循这种模式可以更好地组织和管理Flask应用。
3.单元测试
在Flask中进行单元测试是确保应用程序的不同部分按照预期工作的关键步骤之一。通过编写单元测试可以检查路由、视图函数、模型等组件的正确性从而确保代码的质量和稳定性。以下是一个关于如何在Flask中进行单元测试的详细说明
使用python自带的unittest模块
在项目根目录下创建一个 tests 文件夹用于存放所有的测试文件。测试文件可以按照模块的划分进行组织例如test_main.py、test_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(bWelcome, 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 bWelcome 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(bWelcome, response.data)运行测试
在项目根目录中可以运行下面的命令来执行所有的测试
python -m unittest discover tests或者如果使用了pytest
pytest通过持续集成CI工具如Travis CI、Jenkins等可以自动运行测试确保每次代码变更都没有破坏应用的功能。