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

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.py

class Config:
    DEBUG = False
    SECRET_KEY = 'your_secret_key'
    SQLALCHEMY_DATABASE_URI = 'your_database_uri'

class DevelopmentConfig(Config):
    DEBUG = True

class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = 'your_production_database_uri'

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

# __init__.py

from flask import Flask
from config import Config

def 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 解析时,只有小写的 truefalse 是合法的布尔 值。所有非空的字符在 Python 中都会被视为 True

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

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

2.工厂函数

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

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

创建工厂函数

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

# __init__.py

from flask import Flask
from config import Config

def create_app(config_class=Config):
    app = Flask(__name__)
    app.config.from_object(config_class)

    # 注册蓝图扩展等其他应用组件
    from app.main_blueprint import main_blueprint
    from app.auth_blueprint import auth_blueprint

    app.register_blueprint(main_blueprint)
    app.register_blueprint(auth_blueprint)

    return app

使用工厂函数创建应用

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

# app.py

import os
from app import create_app
from config import DevelopmentConfig, ProductionConfig

env = 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.py

import unittest
from flask import current_app
from app import create_app

class 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.py

from app import create_app

def test_app_exists():
    app = create_app()
    assert app is not None

def test_index_page():
    app = create_app()
    client = app.test_client()
    response = client.get('/')
    assert response.status_code == 200
    assert b'Welcome' in response.data

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

pytest
使用 Flask-Testing 扩展

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

pip install Flask-Testing
# tests/test_main.py

from flask_testing import TestCase
from app import create_app

class 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等),可以自动运行测试,确保每次代码变更没有破坏应用的功能

原文地址:https://blog.csdn.net/weixin_39987031/article/details/134808520

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_49250.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注