尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
零基础入门python19:Flask账本第一步——应用工厂、蓝图和健康检查
零基础入门python19Flask账本第一步——应用工厂、蓝图和健康检查一、上一篇课后练习讲解Python 项目练习是给任务管理器增加优先级和截止日期。参考做法是先修改模型和 JSON 兼容读取再更新 CLI这提醒我们后端项目也应该先定义数据边界再组织入口和业务模块。上一篇课后练习完整答案上一篇要求增加delete_article管理员可以删除任意文章普通用户只能删除自己的文章。下面这份文件可以直接保存为permission_demo.py后运行它用内存列表模拟数据库先做权限判断再删除失败路径不会改变数据。fromdataclassesimportdataclassdataclassclassArticle:id:intauthor_id:inttitle:strdefdelete_article(articles:list[Article],article_id:int,actor_id:int,is_admin:bool)-bool:删除文章并返回是否成功查不到或无权时保持原列表不变。positionnext((ifori,articleinenumerate(articles)ifarticle.idarticle_id),None)ifpositionisNone:returnFalsearticlearticles[position]ifnotis_adminandarticle.author_id!actor_id:returnFalsearticles.pop(position)returnTruedefrun_checks()-None:articles[Article(1,10,作者的文章),Article(2,20,别人的文章)]assertdelete_article(articles,1,actor_id10,is_adminFalse)isTrueassert[article.idforarticleinarticles][2]snapshotlist(articles)assertdelete_article(articles,2,actor_id10,is_adminFalse)isFalseassertarticlessnapshotassertdelete_article(articles,2,actor_id99,is_adminTrue)isTrueassertarticles[]print(permission checks passed)if__name____main__:run_checks()运行python permission_demo.py预期输出permission checks passed。真实项目把pop换成事务中的DELETE并在查询时同时带上资源 id 和当前用户条件管理员分支必须经过单独的角色判断不能让客户端传is_admintrue自行提权。二、本篇完成什么创建 Flask 个人账本 API 的最小骨架跑通/health并理解为什么不把所有代码写进一个app.py。三、应用工厂# app/__init__.pyfromflaskimportFlaskfrom.extensionsimportdb,login_managerdefcreate_app(test_config:dict|NoneNone)-Flask:创建一个独立应用实例测试可以传入临时数据库配置。appFlask(__name__)app.config.from_mapping(SECRET_KEYdev-only-change-me,SQLALCHEMY_DATABASE_URIsqlite:///ledger.db,)iftest_config:app.config.update(test_config)db.init_app(app)login_manager.init_app(app)from.ledgerimportledger_bp app.register_blueprint(ledger_bp)app.get(/health)defhealth():return{status:ok,service:flask-ledger}returnapp应用工厂解决两个实际问题同一个代码可以创建开发、测试和生产实例导入模块时不会立刻连接生产数据库。db.init_app延迟绑定扩展避免循环导入。四、运行与测试python-m venv.venv.venv\\Scripts\\activate pip install-r requirements.txt python-cfrom app import create_app; print(create_app().url_map)python-m pytest-q预期健康检查返回 200测试通过。若出现Working outside of application context说明数据库操作发生在 Flask 应用上下文之外下一篇会专门解释上下文和扩展。五、课后练习增加/ready接口执行一次SELECT 1检查数据库并为数据库不可用时的响应写测试。下一篇会把配置、扩展和蓝图进一步拆开。项目增量应用工厂验收本篇让测试、开发和生产调用同一个 create_app。测试配置覆盖数据库 URI 和密钥导入模块时不连接生产数据库。defcreate_app(test_configNone):appFlask(__name__)app.config.from_mapping(SECRET_KEYchange-me,SQLALCHEMY_DATABASE_URIsqlite:///ledger.db)iftest_config:app.config.update(test_config)db.init_app(app)register_blueprints(app)returnapp验收健康检查 200、测试配置生效、应用上下文外访问数据库得到明确错误。课后练习增加 /ready 并测试数据库不可用场景。六、把“能启动”变成“可继续开发”的骨架刚才的代码看起来很少但它决定了后面十一个章节的接入方式。create_app是唯一的装配点配置在这里加载扩展在这里绑定蓝图在这里注册。业务模块只声明路由和函数不偷偷创建第二个Flask()。这样做的直接收益是测试可以创建一份内存数据库生产启动时则读取环境变量。在项目目录执行下面的命令先把目录建出来如果目录已经存在只需要核对文件内容mkdir app,testsniapp\__init__.py,app\extensions.py,app\ledger.py,tests\conftest.py-ItemType Fileapp/extensions.py只放“还没有绑定到应用”的对象fromflask_sqlalchemyimportSQLAlchemyfromflask_loginimportLoginManager dbSQLAlchemy()login_managerLoginManager()definit_extensions(app):在工厂中集中绑定第三方扩展避免模块导入时产生循环依赖。db.init_app(app)login_manager.init_app(app)init_extensions看似只是两行调用实际是生命周期边界。若把db SQLAlchemy(app)写在模块顶层pytest 导入测试文件时就会创建真实数据库连接连接失败会让连健康检查都无法执行。把绑定延迟到工厂后create_app({TESTING: True, ...})就能在每个测试中得到干净实例。七、用测试客户端验证装配而不是手工猜# tests/conftest.pyimportpytestfromappimportcreate_apppytest.fixture()defclient(tmp_path):db_filetmp_path/test.sqliteappcreate_app({TESTING:True,SQLALCHEMY_DATABASE_URI:fsqlite:///{db_file},})withapp.app_context():fromapp.extensionsimportdb db.create_all()returnapp.test_client()deftest_health(client):responseclient.get(/health)assertresponse.status_code200assertresponse.get_json()[service]flask-ledger运行python -m pytest -q时预期输出类似1 passed in 0.3s。如果出现sqlite3.OperationalError: unable to open database file先打印db_file的绝对路径确认父目录已经由tmp_path创建不要把数据库路径硬编码到项目根目录否则多次运行测试会互相污染。八、调试时应该观察什么flask --app run.py routes应看到/health。如果路由表为空问题在register_blueprint之前如果出现重复端点名通常是同一个蓝图被注册两次。调试配置时可临时执行appcreate_app({TESTING:True})print(app.config[SQLALCHEMY_DATABASE_URI])print([(rule.rule,sorted(rule.methods))forruleinapp.url_map.iter_rules()])不要把SECRET_KEY或数据库密码打印到日志线上排查应只打印bool(value)或经过掩码处理的主机名。本项目下一步会加入用户表因此本篇的健康检查故意不查询业务表让它只回答“进程是否活着”。九、本篇练习提交前自检新增GET /version返回{version: 0.1.0, python: 3.11}并在tests/test_app.py验证字段类型。为create_app增加instance/目录支持把 SQLite 文件放入 instance而不是源码目录。故意将蓝图注册写两次观察flask routes的异常再恢复为一次。完成后保留命令输出截图或终端文本。下一篇会逐项讲解环境配置、扩展初始化和蓝图拆分并把本篇的/version接口接入统一配置。本篇结束完整模块文件下面是交付项目中真实存在的完整文件 flask-ledger/app/init.py。它覆盖本篇新增逻辑以及前文已经完成的依赖代码复制单个函数会丢失上下文因此这里提供整份文件。fromflaskimportFlaskfrom.authimportbpasauth_bpfrom.extensionsimportdb,login_managerfrom.ledgerimportbpasledger_bpdefcreate_app(test_configNone):appFlask(__name__)app.config.from_mapping(SECRET_KEYdev-change-me,SQLALCHEMY_DATABASE_URIsqlite:///ledger.db,SQLALCHEMY_TRACK_MODIFICATIONSFalse,)iftest_config:app.config.update(test_config)db.init_app(app)login_manager.init_app(app)login_manager.unauthorized_handler(lambda:({message:请先登录},401))app.register_blueprint(auth_bp)app.register_blueprint(ledger_bp)app.get(/api/health)defhealth():return{status:ok}withapp.app_context():db.create_all()returnapp
RELATED

相关推荐

PCB板材TG150与TG170核心差异解析

PCB板材TG150与TG170核心差异解析

简单理解:**Tg 是板材从“硬玻璃”变成“软橡胶”的临界温度**。---## 一、核心区别(物理特性)| 特性 | **TG150** | **TG170** | 对实际生产的影响 | | :--- | :--- | :--- | :--- | | **玻璃化转变温度** | ≈ **150℃** | ≈ **170℃** | …

📅 2026/10/19 2:06:18
LLM-Cookbook 学习——使用 LangChain 开发应用程序>模型、提示模板与输出解析器 Models、Prompts and Output Parsers

LLM-Cookbook 学习——使用 LangChain 开发应用程序>模型、提示模板与输出解析器 Models、Prompts and Output Parsers

一、这一章到底在学习什么? 使用大语言模型开发应用时,一个非常典型的过程可以概括成: 用户数据↓ Prompt Template↓ 完整 Prompt↓ Model↓ 模型输出字符串↓ Output Parser↓ Python 字典等结构化数据也就是: 输入 → 组织提…

📅 2026/8/27 4:21:15
设备出海非洲却频频掉线?选对物联网卡才能让业务跑起来

设备出海非洲却频频掉线?选对物联网卡才能让业务跑起来

中非经贸合作正在加速升温。南非是中国在非洲的第一大贸易伙伴,2025年双边贸易额达535.8亿美元;尼日利亚2025年对华进口规模达249.1亿美元,居非洲首位;埃及、肯尼亚、埃塞俄比亚同样位列中国在非洲的五大贸易伙伴之列。越来越多的…

📅 2026/10/19 15:54:09
MORE NEWS

更多资讯

📰

全球化采购管理系统的核心架构与实施策略

1. 项目概述:全球化浪潮下的采购管理新挑战 最近三年间,我接触过47家出海企业的供应链负责人,发现他们普遍面临一个共性难题:当业务版图扩展到3个以上国家时,传统采购管理系统就像穿着紧身衣跳舞——明明知道该怎么做动…

📰

2026财务智能体市场解析与选型指南

1. 财务智能体市场现状与核心价值 2026年的财务智能体市场已经形成了成熟的产业格局。这类智能体本质上是通过AI技术实现财务流程自动化的软件解决方案,它们正在重塑企业财务部门的运作模式。根据Gartner最新报告,全球75%的中大型企业已经部署或正在评估…

📰

EMD+PSO_SVM混合模型在大坝变形预测中的应用

1. 项目概述 大坝变形预测是水利工程安全监测中的核心课题,传统方法常面临非线性、非平稳数据处理难题。本项目创新性地将经验模态分解(EMD)、粒子群优化(PSO)与支持向量机(SVM)相结合,构建了EMDPSO_SVM混合预测模型。通过Matlab实现完整算法流程&#x…

📰

VC6.0在Win7/Win10添加文件失效与FileTool.dll修复

简介:面向仍在使用 Visual C 6.0 的开发者与维护旧项目的技术人员,这份 FileTool 插件资料针对 Windows 7/10 环境下 VC6 无法正常打开文件、添加工程文件的问题,提供可注册的 Developer Studio 附加项及完整源码。压缩包共 51 个文件&#x…

📰

光伏功率预测在极端天气下的挑战与解决方案

1. 光伏功率预测的"黑天鹅"困境 去年西北某光伏电站遭遇了一场突如其来的沙尘暴,30分钟内云层完全遮蔽天空,电站实际出力从满发的50MW骤降到不足5MW。而预测系统给出的曲线依然是一条平滑的弧线,误差率高达90%。这不是个案——根据…

📰

Scikit-learn模型评估:从基础指标到实战应用

1. Scikit-learn简介与模型评估的重要性 Scikit-learn(简称sklearn)作为Python生态中最负盛名的机器学习库之一,其设计哲学始终围绕着实用性和一致性展开。这个由David Cournapeau在2007年启动的项目,如今已成为数据科学家工具箱中…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬