电商网站对比表格,做网站怎么上传图片,湖南室内设计公司排名,杭州做网站的公司哪些比较好目录 1. 项目概述2. 项目结构3. 核心组件解析3.1 动态模块注册系统 (api/__init__.py)3.2 应用程序入口 (setup_demo.py) 4. 模块开发指南4.1 标准模块 (*_app.py)4.2 SDK模块 (sdk/*.py) 5. URL路径规则6. 如何使用6.1 启动应用6.2 添加新模块 7. 工作原理 1. 项目概述
这个项… 目录 1. 项目概述2. 项目结构3. 核心组件解析3.1 动态模块注册系统 (api/__init__.py)3.2 应用程序入口 (setup_demo.py) 4. 模块开发指南4.1 标准模块 (*_app.py)4.2 SDK模块 (sdk/*.py) 5. URL路径规则6. 如何使用6.1 启动应用6.2 添加新模块 7. 工作原理 1. 项目概述
这个项目是一个基于Flask的动态模块注册系统它允许你以一种模块化的方式组织API端点并且能够自动发现和注册这些模块。这种架构特别适合构建可扩展的Web API服务让你可以轻松地添加新功能而无需修改核心代码。
2. 项目结构
flask_path_test/
├── .venv/ # Python虚拟环境目录
├── api/ # API模块目录
│ ├── __init__.py # 核心功能动态模块注册系统
│ ├── product_app.py # 产品模块
│ ├── user_app.py # 用户模块
│ └── sdk/ # SDK模块目录
│ └── auth.py # 认证SDK模块
├── .gitignore # Git忽略文件配置
├── .python-version # Python版本配置文件
├── pyproject.toml # 项目配置文件
├── README.md # 项目说明文档
├── setup_demo.py # 应用程序入口文件
└── uv.lock # 依赖锁定文件环境准备
uv init
uv venv
source .venv/bin/activate
uv pip install flask3. 核心组件解析
3.1 动态模块注册系统 (api/__init__.py)
这个文件是整个系统的核心它实现了以下功能
自动发现模块搜索所有符合命名规则的模块文件动态加载模块使用Python的importlib机制动态加载模块注册Flask蓝图将每个模块注册为Flask蓝图并设置合适的URL前缀提供主页视图显示所有已注册的模块及其URL
关键函数
search_pages_path()搜索所有以_app.py结尾的文件和SDK目录下的Python文件register_page()将找到的模块文件注册为Flask蓝图auto_register_pages()自动注册所有找到的模块 代码
import sys
from pathlib import Path
from importlib.util import spec_from_file_location, module_from_spec
from flask import Flask, Blueprint# 创建Flask应用
app Flask(__name__)
API_VERSION v1
registered_urls []def search_pages_path(pages_dir):搜索页面路径app_path_list [path for path in pages_dir.glob(*_app.py) if not path.name.startswith(.)]# 搜索根目录下的sdkapi_sdk_path_list [path for path in pages_dir.glob(*sdk/*.py) if not path.name.startswith(.)]app_path_list.extend(api_sdk_path_list)return app_path_listdef register_page(page_path):注册页面模块为Flask蓝图path f{page_path}# 获取页面名称去掉_app后缀page_name page_path.stem.rstrip(_app)# 构建模块名称module_name ..join(page_path.parts[page_path.parts.index(api): -1] (page_name,))print(fmodule_name: {module_name})# 动态加载模块spec spec_from_file_location(module_name, page_path)page module_from_spec(spec)# 先设置app和manager再执行模块代码page.app apppage.manager Blueprint(page_name, module_name)sys.modules[module_name] pagespec.loader.exec_module(page)# 获取页面名称可能在模块中重新定义page_name getattr(page, page_name, page_name)# 确定URL前缀sdk_path \\sdk\\ if sys.platform.startswith(win) else /sdk/url_prefix (f/api/{API_VERSION} if sdk_path in path else f/{API_VERSION}/{page_name})print(furl_prefix: {url_prefix})# 注册蓝图app.register_blueprint(page.manager, url_prefixurl_prefix)return url_prefixdef auto_register_pages():自动注册所有页面模块global registered_urls# 创建api目录结构api_dir Path(api)api_dir.mkdir(exist_okTrue)# 搜索并注册所有页面page_paths search_pages_path(api_dir)result []print(page_paths)for page_path in page_paths:try:url_prefix register_page(page_path)result.append((page_path.name, url_prefix))print(f已注册模块: {page_path.name} - {url_prefix})except Exception as e:print(f注册模块 {page_path.name} 失败: {e})return resultapp.route(/)
def index():主页显示所有注册的模块global registered_urlshtml h1Flask 动态模块注册演示/h1html h2已注册的模块:/h2ulfor module_name, url_prefix in registered_urls:html flistrong{module_name}/strong: a href{url_prefix}{url_prefix}/a/lihtml /ulhtml p访问上面的链接查看各个模块的功能/preturn html3.2 应用程序入口 (setup_demo.py)
这个文件是应用程序的入口点它
导入核心组件调用auto_register_pages()注册所有模块启动Flask应用服务器
from api import app, auto_register_pages, registered_urls# 如果需要可以在这里进行额外的配置
# app.config[SOME_CONFIG] some_value# 运行应用程序
if __name__ __main__:# 清空已注册的URL列表registered_urls.clear()# 手动注册所有模块result auto_register_pages()registered_urls.extend(result)print(f已注册的URL: {registered_urls})# 运行应用程序app.run(debugTrue, port5000)4. 模块开发指南
4.1 标准模块 (*_app.py)
标准模块文件需要遵循以下规则
文件名必须以_app.py结尾例如user_app.py、product_app.py模块中可以定义page_name变量来自定义URL路径可选使用manager.route()装饰器定义路由
示例product_app.py
from flask import jsonify# 可以自定义页面名称
page_name productsmanager.route(/)
def product_list():产品列表接口return jsonify({message: 产品模块,products: [{id: 1, name: 笔记本电脑, price: 5999},{id: 2, name: 智能手机, price: 2999}]})manager.route(/int:product_id)
def product_detail(product_id):产品详情接口return jsonify({message: f产品详情 - ID: {product_id},product: {id: product_id, name: f产品{product_id}, price: 1000 product_id * 100}})示例user_app.py
from flask import jsonifymanager.route(/)
def user_list():用户列表接口return jsonify({message: 用户模块,users: [{id: 1, name: 张三, email: zhangsanexample.com},{id: 2, name: 李四, email: lisiexample.com}]})manager.route(/int:user_id)
def user_detail(user_id):用户详情接口return jsonify({message: f用户详情 - ID: {user_id},user: {id: user_id, name: f用户{user_id}, email: fuser{user_id}example.com}})4.2 SDK模块 (sdk/*.py)
SDK模块放置在api/sdk/目录下它们会被自动注册到/api/v1路径下。
示例sdk/auth.py
from flask import jsonify, requestmanager.route(/, methods[GET])
def login():登录接口return jsonify({message: SDK认证模块 - 登录,token: fake_jwt_token_12345,expires_in: 3600})5. URL路径规则
系统会根据模块类型和名称自动生成URL路径
标准模块/v1/{page_name}/ 例如/v1/products/、/v1/user/ SDK模块/api/v1/ 例如/api/v1/auth模块
6. 如何使用
6.1 启动应用
uv run setup_demo.py应用将在http://localhost:5000启动访问主页可以看到所有已注册的模块列表。
6.2 添加新模块
在api/目录下创建新的*_app.py文件定义路由函数重启应用新模块会被自动发现和注册
示例创建新的order_app.py
from flask import jsonify# 可以自定义页面名称
page_name ordersmanager.route(/)
def order_list():订单列表接口return jsonify({message: 订单模块,orders: [{id: 1, product_id: 1, user_id: 1, status: 已付款},{id: 2, product_id: 2, user_id: 2, status: 待发货}]})7. 工作原理
setup_demo.py启动时调用auto_register_pages()auto_register_pages()搜索所有符合规则的模块文件对每个找到的文件调用register_page()进行注册register_page()动态加载模块并将其注册为Flask蓝图所有注册的URL保存在registered_urls列表中并在主页中显示
这个Flask动态模块注册系统提供了一种优雅的方式来组织和扩展你的API服务。通过遵循简单的命名约定和目录结构你可以轻松添加新功能而无需修改核心代码。这种模块化的设计特别适合大型项目让团队成员可以独立开发不同的功能模块。