SAE(Sina App Engine)作為早期國內 PaaS 代表,雖已停止新用戶註冊,但其部署流程對理解雲原生應用遷移仍有參考價值。本文記錄 Django 1.4 版本在 SAE Python 2.7 環境下的完整部署步驟,涵蓋代碼調整、配置文件修改、數據庫同步、靜態文件處理等關鍵環節。
lcnet)。1。https://svn.sinaapp.com/lcnet。检出 SVN 版本 1 到本地(如 E:\svn\lcnet\1),初始僅含 config.yaml、index.wsgi。需調整為:
1/ ├── config.yaml ├── index.wsgi ├── site-packages/ # 新建,放入 Django 1.4 包 │ └── django/ │ └── contrib/admin/static/ → 移至 1/static/ ├── lcnet_blog/ # 你的 Django 項目目錄 │ ├── settings.py │ ├── urls.py │ ├── wsgi.py │ └── ...
name: lcnet version: 1 libraries: - name: "django" version: "1.4" # SAE 內置版本,若自帶請刪除此段 handlers: - url: /static static_dir: static - url: /media static_dir: media
import os, sys
root = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(root, 'site-packages'))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lcnet_blog.settings")
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
import os, sys
from django.core.wsgi import get_wsgi_application
root = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(root, '..', 'site-packages'))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "lcnet_blog.settings")
application = get_wsgi_application()
from django.conf.urls import include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'', include('blog.urls')),
]
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
DEBUG = True
TEMPLATE_DEBUG = False
ALLOWED_HOSTS = ['.sinaapp.com']
# 判斷是否運行在 SAE 環境
import os
debug = not os.environ.get("APP_NAME", "")
if debug: # 本地開發
MYSQL_DB = 'lcnet'
MYSQL_USER = 'root'
MYSQL_PASS = 'root'
MYSQL_HOST_M = '127.0.0.1'
MYSQL_HOST_S = '127.0.0.1'
MYSQL_PORT = '3306'
else: # SAE 線上環境
import sae.const
MYSQL_DB = sae.const.MYSQL_DB
MYSQL_USER = sae.const.MYSQL_USER
MYSQL_PASS = sae.const.MYSQL_PASS
MYSQL_HOST_M = sae.const.MYSQL_HOST
MYSQL_HOST_S = sae.const.MYSQL_HOST_S
MYSQL_PORT = sae.const.MYSQL_PORT
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': MYSQL_DB,
'USER': MYSQL_USER,
'PASSWORD': MYSQL_PASS,
'HOST': MYSQL_HOST_M,
'PORT': MYSQL_PORT,
}
}
python manage.py migrate 生成表結構。lcnet.sql(僅結構+初始數據)。sae-python-dev 模擬 sae.const。APP_NAME、MYSQL_* 等。python manage.py migrate,SAE 會自動同步到線上(需開通同步功能)。1 → SVN Commit → 輸入日誌 → 確定(Django 包較大,上傳較慢,耐心等待)。https://lcnet.sinaapp.com 驗證。| 現象 | 原因 | 解決 |
|---|---|---|
| ImportError: No module named django | site-packages 路徑未加入 sys.path | 檢查 index.wsgi、wsgi.py 中 sys.path.insert 順序 |
| Admin 後台樣式缺失 | static 文件未正確收集/映射 | config.yaml 配置 /static → static_dir;確保 admin static 在 static/admin/ |
| 數據庫連接失敗 | settings.py 環境判斷邏輯錯誤 | 打印 sae.const 變量核對;本地強制 debug=True 測試 |
| SVN 提交卡住/失敗 | 單文件過大/網絡波動 | 分批提交;刪除 .pyc、.git 等無用文件;多重試 |
雖然 SAE 已成歷史,但「配置與代碼分離、環境變量驅動配置、靜態文件獨立服務、數據庫遷移腳本化」等最佳實踐,在 Kubernetes、Serverless 時代依然通用。