Flask 動態模塊注冊

目錄

    • 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 flask

3. 核心組件解析

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(f"module_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(f"url_prefix: {url_prefix}")# 注冊藍圖app.register_blueprint(page.manager, url_prefix=url_prefix)return url_prefixdef auto_register_pages():"""自動注冊所有頁面模塊"""global registered_urls# 創建api目錄結構api_dir = Path("api")api_dir.mkdir(exist_ok=True)# 搜索并注冊所有頁面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 result@app.route('/')
def index():"""主頁顯示所有注冊的模塊"""global registered_urlshtml = "<h1>Flask 動態模塊注冊演示</h1>"html += "<h2>已注冊的模塊:</h2><ul>"for module_name, url_prefix in registered_urls:html += f"<li><strong>{module_name}</strong>: <a href='{url_prefix}'>{url_prefix}</a></li>"html += "</ul>"html += "<p>訪問上面的鏈接查看各個模塊的功能</p>"return html

3.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(debug=True, port=5000)

4. 模塊開發指南

4.1 標準模塊 (*_app.py)

標準模塊文件需要遵循以下規則:

  1. 文件名必須以_app.py結尾(例如:user_app.pyproduct_app.py
  2. 模塊中可以定義page_name變量來自定義URL路徑(可選)
  3. 使用@manager.route()裝飾器定義路由

示例(product_app.py):

from flask import jsonify# 可以自定義頁面名稱
page_name = "products"@manager.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 jsonify@manager.route('/')
def user_list():"""用戶列表接口"""return jsonify({"message": "用戶模塊","users": [{"id": 1, "name": "張三", "email": "zhangsan@example.com"},{"id": 2, "name": "李四", "email": "lisi@example.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": f"user{user_id}@example.com"}})

4.2 SDK模塊 (sdk/*.py)

SDK模塊放置在api/sdk/目錄下,它們會被自動注冊到/api/v1路徑下。

示例(sdk/auth.py):

from flask import jsonify, request@manager.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 添加新模塊

  1. api/目錄下創建新的*_app.py文件
  2. 定義路由函數
  3. 重啟應用,新模塊會被自動發現和注冊

示例(創建新的order_app.py):

from flask import jsonify# 可以自定義頁面名稱
page_name = "orders"@manager.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. 工作原理

  1. setup_demo.py啟動時調用auto_register_pages()
  2. auto_register_pages()搜索所有符合規則的模塊文件
  3. 對每個找到的文件,調用register_page()進行注冊
  4. register_page()動態加載模塊,并將其注冊為Flask藍圖
  5. 所有注冊的URL保存在registered_urls列表中,并在主頁中顯示

這個Flask動態模塊注冊系統提供了一種優雅的方式來組織和擴展你的API服務。通過遵循簡單的命名約定和目錄結構,你可以輕松添加新功能而無需修改核心代碼。這種模塊化的設計特別適合大型項目,讓團隊成員可以獨立開發不同的功能模塊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/84962.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84962.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/84962.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM 內存、JMM內存與集群機器節點內存的聯系

目錄 1、JVM 內存 1.1、分配機制 1.2、jvm模型位置 1.3、字節碼內存塊 2、JMM內存 2.1、JMM模型 2.2、工作流程圖 1、工作內存與主內存的交互 2. 多線程下的主內存與堆內存交互 2.3、 主內存與工作內存的同步方案 1、volatile 2、synchronized 3、final 3、內存使…

學習昇騰開發的第一天--環境配置

1、昇騰社區官網&#xff1a;昇騰社區官網-昇騰萬里 讓智能無所不及 2、產品-->選擇開發者套件-->點擊制卡工具的下載&#xff1a;資源-Atlas 200I DK A2-昇騰社區 3、如果制卡工具不能使用在線制卡&#xff0c;可以下載鏡像到本地使用本地制卡&#xff1a;Linux系統制…

Android WebView 深色模式適配方案總結

Android WebView 深色模式適配方案總結 在 Android WebView 中適配深色模式&#xff08;Dark Mode&#xff09;是一個常見的需求&#xff0c;尤其是當加載的網頁沒有原生支持 prefers-color-scheme 時。本文將介紹 3 種主流方案&#xff0c;并分析它們的優缺點&#xff0c;幫助…

項目練習:使用mybatis的foreach標簽,實現union all的拼接語句

文章目錄 一、需求說明二、需求分析三、代碼實現四、報表效果 一、需求說明 在sql查詢數據后&#xff0c;對數據分組統計。并最后進行總計。 二、需求分析 最終&#xff0c;我想用sql來實現這個統計和查詢的功能。 那么&#xff0c;怎么又查詢&#xff0c;又統計了&#xf…

7.7 Extracting and saving responses

Chapter 7-Fine-tuning to follow instructions 7.7 Extracting and saving responses 在本節中&#xff0c;我們保存測試集響應以便在下一節中評分&#xff0c;除此之外保存模型的副本以供將來使用。 ? 首先&#xff0c;讓我們簡單看看finetuned模型生成的響應 torch.manu…

計算機網絡第3章(上):數據鏈路層全解析——組幀、差錯控制與信道效率

目錄 一、數據鏈路層的功能二、組幀2.1 字符計數法&#xff08;Character Count&#xff09;2.2 字符填充法&#xff08;Character Stuffing&#xff09;2.3 零比特填充法2.4 違規編碼法 三、差錯控制3.1 檢錯編碼&#xff08;奇偶校驗碼&#xff09;3.2 循環冗余校驗&#xff…

鑄鐵試驗平臺的重要性及應用前景

鑄鐵作為一種重要的金屬材料&#xff0c;在工業生產中扮演著舉足輕重的角色。為了確保鑄鐵制品的質量和性能&#xff0c;鑄鐵材料的試驗是必不可少的環節。而鑄鐵試驗平臺則是進行鑄鐵試驗的關鍵設備之一&#xff0c;它為鑄鐵材料的研究和開發提供了重要的技術支持。本文將探討…

std::shared_ptr引起內存泄漏的例子

目錄 一、循環引用&#xff08;最常見場景&#xff09; 示例代碼 內存泄漏原因 二、共享指針管理的對象包含自身的 shared_ptr 示例代碼 內存泄漏&#xff08;或雙重釋放&#xff09;原因 三、解決方案 1. 循環引用&#xff1a;使用 std::weak_ptr 2. 對象獲取自身的 …

AI 知識數據庫搭建方案:從需求分析到落地實施

AI 知識數據庫的搭建需結合業務場景、數據特性與技術架構&#xff0c;形成系統化解決方案。以下是一套完整的搭建框架&#xff0c;涵蓋規劃、設計、實施及優化全流程&#xff1a; 一、前期規劃&#xff1a;需求分析與目標定義 1. 明確業務場景與知識需求 場景導向&#xff1a…

Tensorflow 基礎知識:變量、常量、占位符、Session 詳解

在深度學習領域,TensorFlow 是一個廣泛使用的開源機器學習框架。想要熟練使用 TensorFlow 進行模型開發,掌握變量、常量、占位符和 Session 這些基礎知識是必不可少的。接下來,我們就深入了解一下它們的概念、用處,并通過代碼示例進行演示。 一、常量(Constant) 常量,顧…

linux 常見問題之如何清除大文件的內容

linux 常見問題之如何清除大文件的內容 在 Linux 系統中&#xff0c;我們有時會遇到文件隨著時間增長變得巨大&#xff0c;最常見的就是服務器的日志文件&#xff0c;隨著時間的推移占用大量的磁盤空間&#xff0c;下面介紹如何清楚大文件的內容&#xff0c;當然避免文件內容過…

薛定諤的貓思想實驗如何推演到量子計算

前言 這是我的選修課作業&#xff0c;但是我并不喜歡小論文方式的寫法&#xff0c;死板又老套。先在這打一份底稿。 薛定諤的貓 可能一說到量子這個關鍵詞&#xff0c;大家第一時間都會想到的是“薛定諤的貓”。 實驗介紹 薛定諤的貓是一個著名的思想實驗&#xff0c;由奧…

嵌入式開發中fmacro-prefix-map選項解析

在嵌入式開發中&#xff0c;-fmacro-prefix-map 是 GCC 和 Clang 等編譯器提供的一個路徑映射選項&#xff0c;主要用于在預處理階段重寫宏定義中出現的絕對路徑。它的核心目的是解決以下問題&#xff1a; 核心作用 構建可重現性 消除編譯輸出&#xff08;如 .o、.d 文件&…

Javaweb學習——day3(Servlet 中處理表單數據)

文章目錄 一、概念學習1. GET vs POST 請求方式的區別2. HttpServletRequest 獲取表單數據 二、代碼講解與練習第 1 步&#xff1a;在 webapp 下創建 login.html第 2 步&#xff1a;在 com.example 包下創建 LoginServlet第 3 步&#xff1a;修改 web.xml 注冊 LoginServlet第 …

在 iOS 開發中單獨解析域名為 IP

1 為什么要自己解析? 典型場景說明劫持/污染檢測比較 系統解析 與 自建 DNS 的差異QoS / CDN 選路對每個候選 IP 做 RT/丟包測速系統 API(NSURLSession / Network.framework)在「真正建立連接之前」不會把解析結果暴露出來,因此需要主動解析一步。 2 API 選型概覽 API是否過…

YOLOv1 技術詳解:正負樣本劃分與置信度設計

&#x1f50d; YOLOv1 技術詳解&#xff1a;正負樣本劃分與置信度設計 一、前言 YOLOv1 是目標檢測領域中具有劃時代意義的算法之一&#xff0c;它將檢測任務統一為一個回歸問題&#xff0c;實現了“You Only Look Once”的端到端實時檢測。其中&#xff0c;正負樣本的劃分機…

為 Nginx 配置 HTTPS(以 n8n 為例)完整教程【CentOS 7】

在部署如 n8n 這類自動化平臺時&#xff0c;為了保障數據傳輸安全&#xff0c;我們通常會使用 HTTPS 訪問。本文將以 n8n.example.com 為例&#xff0c;介紹如何在 CentOS 7 系統中通過 Nginx 為本地運行在端口 5678 的 n8n 服務配置免費 SSL 證書&#xff08;Let’s Encrypt&a…

Elasticsearch從安裝到實戰、kibana安裝以及自定義IK分詞器/集成整合SpringBoot詳細的教程ES(四)查詢、排序、分頁、高亮

基礎代碼 package com.test.xulk;import com.alibaba.fastjson.JSON; import com.test.xulk.es.esdoc.HotelDoc; import com.test.xulk.es.service.IHotelService; import org.apache.http.HttpHost; import org.elasticsearch.action.search.SearchRequest; import org.elast…

一個數組樣式上要分成兩個

如圖所示&#xff0c;要有一個區分來顯示&#xff0c;如果一開始就是這樣還可以有很多種處理方式&#xff0c;但是這個后期一直在調整所以不好重做因為開發已經完成&#xff0c;加上很多地方聯動改的地方太多&#xff0c;所以采用了一個比較笨的方法 <ul class"classif…

NLP進化史:從規則模板到思維鏈推理,七次范式革命全解析

“語言不是神的創造物&#xff0c;而是平凡人類的產物。”——諾姆喬姆斯基 自然語言處理&#xff08;NLP&#xff09;的發展史&#xff0c;就是人類試圖教會機器理解語言本質的探索史。本文將帶您穿越70年技術長河&#xff0c;揭示NLP領域關鍵的范式轉換里程碑。 一、規則驅動…