Pylons 1.0 釋出標誌著 API 穩定,適合正式產品開發。其核心優勢在於高度可定制:不重造輪子,而是整合現有 Python 生態。Model 層預設支援 SQLAlchemy,若要引入 MongoDB,輕量級 ORM Ming 是官方推薦選擇(源自 SourceForge 以 TurboGears + MongoDB 重構的副產品)。本文以實戰專案結構示範從設定檔到模型定義的完整整合流程。
PROJECT/
├── model/
│ └── __init__.py # 模型定義與 Ming 初始化
├── config/
│ └── environment.py # 應用環境載入,含 DB 引擎建立
├── websetup.py # 部署時初始化資料
└── development.ini # 設定檔
model/__init__.py)from ming import Session, schema
from ming.orm import MappedClass, FieldProperty, ForeignIdProperty, RelationProperty
from ming.orm import ThreadLocalORMSession
session = None # 全域 Session 物件,稍後由 init_model 注入
def init_single_model(model_class):
model_class.__mongometa__.session = session
class Page(MappedClass):
class __mongometa__:
session = session
name = 'pages' # MongoDB collection 名稱
_id = FieldProperty(schema.ObjectId)
title = FieldProperty(str)
content = FieldProperty(str)
def init_model(engine):
global session
session = ThreadLocalORMSession(doc_session=Session(engine))
init_single_model(Page)
MappedClass.compile_all() # 編譯所有映射類別
關鍵點:
ThreadLocalORMSession 確保請求級別的 Session 隔離,適合 Web 環境。MappedClass.compile_all() 必須在所有模型定義完成後呼叫一次。ObjectId, str 等)。config/environment.py)from ..model import init_model
from ming.datastore import DataStore
def load_environment(global_conf, app_conf):
# ... 既有 Mako 模板設定 ...
# 建立 MongoDB 引擎並初始化模型
init_model(DataStore(config['database.uri']))
return config
development.ini)[app:main]
database.uri = mongodb://localhost:27017/test
URI 格式支援認證、Replica Set 等進階選項,參考 MongoDB 連接字串規格。
websetup.py)
def setup_app(command, conf, vars):
if not pylons.test.pylonsapp:
load_environment(conf.global_conf, conf.local_conf)
log.info("Adding demo data.")
page = model.Page(title='demo', content='This is for demo.')
model.session.flush() # 同步寫入 MongoDB
log.info("Successfully set up.")
Ming API 設計參考 SQLAlchemy,上手快。若專案需求不同,亦可替換為:
Pylons 現已併入 Pyramid,新專案建議直接使用 Pyramid + pyramid_mongodb 或原生 Motor。既有 Pylons 專案可參考官方遷移指南逐步轉型。