您可以使用本機開發伺服器模擬在實際工作環境中執行 App Engine 應用程式,也可以使用本機開發伺服器存取 App Engine 套裝服務。
模擬的環境會強制執行一些沙箱限制,例如有限的系統功能和 Python 2 模組匯入,但不包括要求逾時或配額等限制。
App Engine 適用的 SDK 所含程式庫提供多項服務 (包括 Datastore、Memcache 和工作佇列),而本機開發伺服器也會在本機中執行這些服務的工作,以便進行模擬。在開發伺服器中執行應用程式時,仍可使用 Google API HTTP 端點對正式基礎架構進行遠端 API 呼叫。
事前準備
由於 Python 2.7 已停止支援,您無法再使用最新版的 dev_appserver.py
在本機執行應用程式。如要下載已封存的 devapp_server.py
版本,請按照下列步驟操作:
從存檔中,下載包含
dev_appserver.py
伺服器的壓縮資料夾,以便針對已停止支援的執行階段使用。將目錄內容解壓縮到本機檔案系統,例如
/home
目錄。您可以在google_appengine/
目錄中找到dev_appserver.py
。
設定本機開發伺服器
如要執行本機開發伺服器工具,您必須設定下列項目:
確認您已安裝 Python 2 版本 2.7.12 以上的轉譯器。
將殼層中的
DEVAPPSERVER_ROOT
環境變數設為 Python 2 轉譯器的路徑。
執行本機開發伺服器
設定本機開發伺服器並為應用程式建立 app.yaml
設定檔後,您就可以使用 dev_appserver.py
指令在本機執行應用程式。
如要啟動本機開發伺服器:
在包含
app.yaml
設定檔的目錄中,執行dev_appserver.py
指令。指定應用程式目錄的路徑,例如:
python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py [PATH_TO_YOUR_APP]
或者,您也可以指定特定服務的設定檔,例如:
python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py app.yaml
如要變更通訊埠,請加入
--port
選項:python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --port=9999 [PATH_TO_YOUR_APP]
將
[DEVAPPSERVER_ROOT]
替換為您用來擷取devapp_server.py
封存版本的資料夾路徑。如要進一步瞭解
dev_appserver.py
指令選項,請參閱「本機開發伺服器選項」。本機開發伺服器現已開始執行並監聽要求。您可以使用網路瀏覽器造訪 http://localhost:8080/,查看運作中的應用程式。
如果您使用了
--port
選項指定自訂通訊埠,請務必在瀏覽器中開啟該通訊埠。
如要透過指令列停止本機伺服器,請按下以下按鍵:
- macOS 或 Linux:Control + C
- Windows:Control + Break 鍵
指定應用程式 ID
如想透過本機伺服器查看應用程式 ID,以便代表某個電子郵件地址進行操作或執行其他作業,請使用 get_application_id()
函式。如要取得運作中應用程式的主機名稱,請使用 get_default_version_hostname()
函式。
偵測應用程式執行階段環境
如要判定程式碼是在實際工作環境或本機開發伺服器中執行,請檢查 SERVER_SOFTWARE
環境變數的值:
if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
# Production
else:
# Local development server
使用本機 Datastore
本機開發伺服器會使用在本機伺服器叫用之間持續存在的本機檔案來模擬 App Engine Datastore。
如要進一步瞭解索引和 index.yaml
,請參閱「Datastore 索引」和「Datastore 索引設定」頁面。
瀏覽本機 Datastore
如果應用程式透過本機開發伺服器將資料寫入本機 Datastore,您可以在本機開發控制台瀏覽這些內容。
如要瀏覽本機 Datastore:
在本機開發控制台中存取 Datastore 檢視器 (網址為
http://localhost:8000/datastore
)。檢視本機 Datastore 內容。
指定 ID 分配政策
對於實際環境的 App Engine,您可以設定 Datastore 自動產生實體 ID。
雖然實際運作伺服器的自動 ID 指派政策跟開發伺服器採用的政策截然不同,您還是可以為本機伺服器設定自動 ID 分派政策。
如要指定自動 ID 指派政策,請使用 --auto_id_policy
選項:
python2 DEVAPPSERVER_ROOT /google_appengine/dev_appserver.py --auto_id_policy=sequential
取代:
DEVAPPSERVER_ROOT,其中包含您用來擷取
devapp_server.py
封存版本的資料夾路徑。--auto_id_policy
與下列其中一個值:scattered
:(預設) 從大致平均分佈且不重複的整數序列指派 ID。sequential
:從連續的整數序列指派 ID。
清除本機 Datastore
如要清除應用程式的本機資料儲存庫,請叫用本機開發伺服器,如下所示:
python2 DEVAPPSERVER_ROOT /google_appengine/dev_appserver.py --clear_datastore=yes app.yaml
將 DEVAPPSERVER_ROOT 替換為您擷取 devapp_server.py
封存版本的資料夾路徑。
變更本機 Datastore 的位置
如要變更資料儲存庫檔案使用的位置,請使用 --datastore_path
選項:
python2 DEVAPPSERVER_ROOT /google_appengine/dev_appserver.py --datastore_path=/tmp/myapp_datastore app.yaml
將 DEVAPPSERVER_ROOT 替換為您用來擷取 devapp_server.py
封存版本的資料夾路徑。
使用 Users 服務
App Engine 提供的 Users 服務可以簡化應用程式的驗證和授權作業。本機開發伺服器會使用本身的登入和登出頁面模擬 Google 帳戶的行為。在本機開發伺服器執行時,users.create_login_url
和 users.create_logout_url
函式會回傳本機伺服器上的 /_ah/login
和 /_ah/logout
網址。
使用郵件
本機開發伺服器可透過 SMTP 伺服器或安裝於本機的 Sendmail 來傳送呼叫 App Engine 郵件服務的電子郵件。
如要透過 SMTP 伺服器來啟用郵件支援功能,請叫用 dev_appserver.py
,如下所示:
python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --smtp_host=smtp.example.com --smtp_port=25 \
--smtp_user=ajohnson --smtp_password=k1tt3ns [PATH_TO_YOUR_APP]
取代:
[DEVAPPSERVER_ROOT]
,其中包含您用來擷取devapp_server.py
封存版本的資料夾路徑。--smtp_host
、--smtp_port
、--smtp_user
和--smtp_password
選項,並使用您自己的設定值。
如要透過 Sendmail 啟用郵件支援功能,請叫用 dev_appserver.py
,如下所示:
python2 [DEVAPPSERVER_ROOT]/google_appengine/dev_appserver.py --enable_sendmail=yes [PATH_TO_YOUR_APP]
將 [DEVAPPSERVER_ROOT]
替換為您擷取 devapp_server.py
封存版本的資料夾路徑。
本機伺服器將透過 sendmail
指令以安裝的預設設定來傳送電子郵件訊息。
使用網址擷取
應用程式使用 URL Fetch API 發出 HTTP 要求時,本機開發伺服器會直接從您的電腦發出要求。如果您是使用 Proxy 伺服器來存取網站,本機伺服器中的 URL Fetch 行為可能會與實際工作環境 App Engine 不同。
使用互動式控制台
互動式控制台可讓開發人員將任意的 Python 程式碼輸入網路表單,並在應用程式環境內加以執行。這個控制台提供的應用程式環境和服務存取權與應用程式內含的 .py 檔案相同。
如要使用互動式控制台:
在本機開發控制台中存取互動式控制台。(網址為
http://localhost:8000/console
)。在文字區域輸入您要執行的任何 Python 程式碼,然後提交表單以執行該程式碼。舉例來說,以下程式碼將新增名為
Greeting
的 Datastore 實體,其中包含文字內容Hello
:from google.appengine.ext import ndb class Greeting(ndb.Model): content = ndb.TextProperty() e = Greeting(content="Hello") e.put()
使用 Python 偵錯工具進行偵錯
如何使用 Python 偵錯工具 (pdb
):
在程式碼中加入以下行:
import pdb; pdb.set_trace();
dev_appserver
會在此時中斷,並進入pdb
REPL (讀取-評估-列印迴圈),方便您透過指令列對程式碼進行偵錯。如果應用程式同時提出多個會叫用
pdb.set_trace()
的要求,系統會同時啟動多個偵錯工作階段,每個工作階段都會將輸出內容傳送至STDOUT
。如要避免這種情況,請停用dev_appserver
多執行緒和多重處理支援功能,以便將要求序列化,如下所示:停用以下項目的多執行緒:
- 使用
--threadsafe_override=false
標記的所有服務。 - 使用
--threadsafe_override=<SERVICENAME>:false
標記的單一服務。 - 使用
--threadsafe_override=<SERVICE1NAME>:false,<SERVICE2NAME>:false
標記的多項服務。
- 使用
停用多重處理:
- 使用
--max_module_instances=1
標記的所有服務。 - 使用
--max_module_instances=<SERVICENAME>:1
標記的單一服務。 - 使用
--max_module_instances=<SERVICE1NAME>:1,<SERVICE2NAME>:1
標記的多項服務。
- 使用