在 Azure 中使用 Django 建立 Web 應用程式

本教學課程說明如何在 Azure App Service Web Apps上開始執行 Python。 Web Apps 提供有限的免費裝載和快速部署,而您可以使用 Python! 隨著應用程式規模增加,您可以切換為付費主控,也可以與其他所有 Azure 服務整合。

您將建立使用 Django Web 架構的應用程式 (請參閱本教學課程適用於 FlaskBottle 的替代版本)。 您會從 Azure Marketplace 建立 Web 應用程式、設定 Git 部署,並於本機複製儲存機制。 然後您會在本機執行應用程式、進行變更、認可和推送至 Azure。 本教學課程示範如何從 Windows 或 Mac/Linux 執行這項操作。

注意

若要完成此教學課程,您需要 Azure 帳戶。 您可以啟用自己的 Visual Studio 訂閱者權益或是申請免費試用

注意

如果您想在註冊 Azure 帳戶前開始使用 Azure App Service,請移至 試用 App Service,即可在 App Service 中立即建立短期入門 Web 應用程式。 不需要信用卡;無需承諾。

必要條件

  • Windows、Mac 或 Linux
  • Python 2.7 或 3.4
  • setuptools、pip、virtualenv (僅 Python 2.7)
  • Git
  • Python Tools for Visual Studio (PTVS) - 注意:這是選擇性的

注意:Python 專案目前不支援 TFS 發佈。

Windows

如果您還沒有安裝 Python 2.7 或 3.4 (32 位元),建議您使用 Web Platform Installer 安裝 Azure SDK for Python 2.7Azure SDK for Python 3.4。 這會安裝 32 位元版本的 Python、setuptools、pip、virtualenv 等 (32 位元 Python 安裝於 Azure 主機電腦上)。 或者,您可以從 python.org取得 Python。

針對 Git,建議您安裝 Git for WindowsGitHub for Windows。 如果您使用 Visual Studio,您可以使用整合式的 Git 支援。

我們也建議您安裝 Python Tools 2.2 for Visual Studio。 這是選擇性的,但如果您有 Visual Studio,它會提供您絕佳的 Python IDE。

Mac/Linux

您應該已經安裝 Python 與 Git,但請確定您擁有的是 Python 2.7 或 3.4。

在入口網站中建立 Web 應用程式

建立應用程式的第一步是透過 Azure 入口網站建立 Web 應用程式。

  1. 登入 Azure 入口網站中,並按一下左下角的 [新增] 按鈕。
  2. 在搜尋方塊中,輸入 "python"。
  3. 在搜尋結果中,選取 [Django (由 PTVS 發佈)],然後按一下 [建立]。
  4. 設定新的 Django 應用程式,例如為它建立新的應用程式服務方案和新的資源群組。 然後按一下 [建立] 。
  5. 依照 本機 Git 部署至 Azure App Service的指示,為您新建立的 Web 應用程式設定 Git 發佈功能。

應用程式概觀

Git 儲存機制內容

以下是您會在初始的 Git 儲存機制中找到的檔案概觀,我們將在下一節中複製。

\app\__init__.py
\app\forms.py
\app\models.py
\app\tests.py
\app\views.py
\app\static\content\
\app\static\fonts\
\app\static\scripts\
\app\templates\about.html
\app\templates\contact.html
\app\templates\index.html
\app\templates\layout.html
\app\templates\login.html
\app\templates\loginpartial.html
\DjangoWebProject\__init__.py
\DjangoWebProject\settings.py
\DjangoWebProject\urls.py
\DjangoWebProject\wsgi.py

應用程式的主要來源。 包含 3 個主要的版面配置頁面 (index、about、contact)。 靜態內容和指令碼,包含啟動程序、jquery、modernizr 和回應。

\manage.py

本機管理和開發伺服器支援。 使用這個選項在本機執行應用程式、同步處理資料庫等等。

\db.sqlite3

預設資料庫。 包含所需的資料表,應用程式才能執行,但不包含任何使用者 (同步處理資料庫來建立使用者)。

\DjangoWebProject.pyproj
\DjangoWebProject.sln

搭配 Python Tools for Visual Studio使用的專案檔。

\ptvs_virtualenv_proxy.py

虛擬環境和 PTVS 遠端偵錯支援的 IIS Proxy。

\requirements.txt

此應用程式所需的外部封裝。 部署指令碼將 pip 安裝在這個檔案中所列的封裝。

\web.2.7.config
\web.3.4.config

IIS 組態檔。 部署指令碼會使用適當的 web.x.y.config,並將它複製為 web.config。

選用的檔案 - 自訂部署

如果以下條件成立 ,Azure 將會確定您的應用程式使用 Python:

  • 根資料夾中有 requirements.txt 檔案
  • 根資料夾中有任何 .py 檔案,或擁有指定 Python 的 runtime.txt

若是如此,它將使用 Python 專屬的部署指令碼,此指令碼可執行檔案的標準同步處理,以及其他 Python 作業,例如:

  • 自動管理虛擬環境
  • 使用 PIP 安裝列在 requirements.txt 中的封裝
  • 根據選取的 Python 版本建立適當的 web.config。
  • 收集適用於 Django 應用程式的靜態檔案

您可以控制某些方面的預設部署步驟,而不需要自訂指令碼。

如果您想要略過所有 Python 專屬的部署步驟,可以建立此空白檔案:

\.skipPythonDeployment

如果您想要跳過 Django 應用程式的靜態檔案收集:

\.skipDjango 

若要更能掌控部署,您可以建立以下檔案來覆寫預設的部署指令碼:

\.deployment
\deploy.cmd

您可以使用 Azure command-line interface 建立檔案。 從您的專案資料夾中使用此命令:

azure site deploymentscript --python

當這些檔案不存在時,Azure 會建立一個暫存的部署指令碼,並執行該指令碼。 它與您使用上述命令建立的指令碼完全相同。

選用的檔案 - Python 執行階段

Azure 將會使用下列優先順序,決定要用於其虛擬環境的 Python 版本:

  1. 在根資料夾的 runtime.txt 中指定的版本
  2. 在 Web 應用程式組態 (在 Azure 入口網站中您 Web 應用程式的 [設定] > [應用程式設定] 刀鋒視窗) 中,由 Python 設定所指定的版本
  3. 如果未指定上述任何版本,python 2.7 為預設值

內容的有效值

\runtime.txt

包括:

  • python-2.7
  • python-3.4

如果指定微版本 (第三個數字),則會忽略它。

在伺服器上的其他檔案

某些檔案存在於伺服器上,但未加入至 Git 儲存機制。 這些檔案由部署指令碼建立。

\web.config

IIS 組態檔。 從 web.x.y.config 建立於每個部署上。

\env\

Python 虛擬環境。 如果 Web 應用程式上不存在相容的虛擬環境,會於部署期間建立。 requirements.txt 中所列封裝為 pip 安裝,但是如果封裝已安裝,pip 會跳過安裝。

接下來的 3 小節會說明如何在 3 個不同環境中繼續進行 Web 應用程式開發:

  • Windows,使用 Python Tools for Visual Studio
  • Windows,使用命令列
  • Mac/Linux,使用命令列

Web 應用程式開發 - Windows - 適用於 Visual Studio 的 Python 工具

複製儲存機制

首先,使用 Azure 入口網站上提供的 URL 複製儲存機制。 如需詳細資訊,請參閱 本機 Git 部署至 Azure App Service

開啟包含在儲存機制根目錄中的方案檔 (.sln)。

建立虛擬環境

現在我們要建立本機開發的虛擬環境。 以滑鼠右鍵按一下 [Python 環境],選取 [新增虛擬環境...]。

  • 請確定環境的名稱是 env
  • 選取基礎解譯器。 確認使用針對您 Web 應用程式選取的 Python 版本 (在 runtime.txt 中,或在 Azure 入口網站中您的 Web 應用程式的 [應用程式設定] 分頁中) 相同的版本。
  • 確定已勾選下載並安裝封裝的選項。

按一下 [建立] 。 這會建立虛擬環境,並安裝 requirements.txt 中列出的相依性。

建立超級使用者

應用程式包含的資料庫並沒有定義任何超級使用者。 若要使用應用程式登入功能或 Django 管理介面 (如果您決定要啟用它),您必須建立超級使用者。

從您專案資料夾的命令列執行:

env\scripts\python manage.py createsuperuser

請依照下列提示來設定使用者名稱、密碼等等。

使用開發伺服器來執行

按 F5 開始偵錯,並且網頁瀏覽器會自動開啟在本機執行的頁面。

您可以在來源中設定中斷點、使用監看式視窗等等。如需各種功能的詳細資訊,請參閱 Python Tools for Visual Studio 文件

進行變更

現在您可以嘗試對應用程式來源和/或範本進行變更。

測試過您的變更之後,請將它們認可至 Git 儲存機制:

安裝更多封裝

您的應用程式可能會擁有 Python 和 Django 之外的相依性。

您可以使用 pip 安裝其他封裝。 若要安裝封裝,以滑鼠右鍵按一下虛擬環境,然後選取 [安裝 Python 封裝] 。

例如,若要安裝 Azure SDK for Python,讓您可存取 Azure 儲存體、服務匯流排和其他 Azure 服務,請輸入 azure

以滑鼠右鍵按一下虛擬環境,然後選取 [產生 requirements.txt] 更新 requirements.txt。

然後,將變更認可到 Git 儲存機制的 requirements.txt。

部署至 Azure

若要觸發部署,按一下 [同步] 或 [推送]。 同步處理會推送和提取。

第一次部署將需要一些時間,因為它會建立虛擬環境、安裝封裝等。

Visual Studio 不會顯示部署進度。 如果您想要檢閱輸出,請參閱 疑難排解 - 部署一節。

瀏覽至 Azure URL,以檢視您的變更。

Web 應用程式開發 - Windows - 命令列

複製儲存機制

首先,使用 Azure 入口網站上提供的 URL 複製儲存機制,並將 Azure 儲存機制加入為遠端。 如需詳細資訊,請參閱 本機 Git 部署至 Azure App Service

git clone <repo-url>
cd <repo-folder>
git remote add azure <repo-url>

建立虛擬環境

我們要建立開發用途的新虛擬環境 (不加入至儲存機制)。 Python 虛擬環境不可重置,因此每位使用該應用程式的開發人員都會在本機建立。

務必使用正確的 Python 版本;應與您為 Web 應用程式所選取的版本相同 (在 runtime.txt 中,或在 Azure 入口網站中您的 Web 應用程式的 [應用程式設定] 刀鋒視窗中) 相同的版本。

針對 Python 2.7:

c:\python27\python.exe -m virtualenv env

針對 Python 3.4:

c:\python34\python.exe -m venv env

安裝應用程式所需的任何外部封裝。 您可以在儲存機制的根目錄使用 requirements.txt 檔案,在虛擬環境中安裝封裝:

env\scripts\pip install -r requirements.txt

建立超級使用者

應用程式包含的資料庫並沒有定義任何超級使用者。 若要使用應用程式登入功能或 Django 管理介面 (如果您決定要啟用它),您必須建立超級使用者。

從您專案資料夾的命令列執行:

env\scripts\python manage.py createsuperuser

請依照下列提示來設定使用者名稱、密碼等等。

使用開發伺服器來執行

您可以使用下列命令,在開發伺服器下啟動應用程式:

env\scripts\python manage.py runserver

主控台會顯示 URL,以及伺服器接聽的通訊埠:

然後,開啟網頁瀏覽器指向該 URL。

進行變更

現在您可以嘗試對應用程式來源和/或範本進行變更。

測試過您的變更之後,請將它們認可至 Git 儲存機制:

git add <modified-file>
git commit -m "<commit-comment>"

安裝更多封裝

您的應用程式可能會擁有 Python 和 Django 之外的相依性。

您可以使用 pip 安裝其他封裝。 例如,若要安裝 Azure SDK for Python,讓您可存取 Azure 儲存體、服務匯流排和其他 Azure 服務,請輸入:

env\scripts\pip install azure

請務必更新 requirements.txt:

env\scripts\pip freeze > requirements.txt

認可變更:

git add requirements.txt
git commit -m "Added azure package"

部署至 Azure

若要觸發部署,將變更推送至 Azure:

git push azure master

您會看到部署指令碼的輸出,包括虛擬環境建立、安裝封裝、建立 web.config。

瀏覽至 Azure URL,以檢視您的變更。

Web 應用程式開發 - Mac/Linux - 命令列

複製儲存機制

首先,使用 Azure 入口網站上提供的 URL 複製儲存機制,並將 Azure 儲存機制加入為遠端。 如需詳細資訊,請參閱 本機 Git 部署至 Azure App Service

git clone <repo-url>
cd <repo-folder>
git remote add azure <repo-url>

建立虛擬環境

我們要建立開發用途的新虛擬環境 (不加入至儲存機制)。 Python 虛擬環境不可重置,因此每位使用該應用程式的開發人員都會在本機建立。

務必使用正確的 Python 版本;應與您為 Web 應用程式所選取的版本相同 (在 runtime.txt 中,或在 Azure 入口網站中您的 Web 應用程式的 [應用程式設定] 刀鋒視窗中) 相同的版本。

針對 Python 2.7:

python -m virtualenv env

針對 Python 3.4:

python -m venv env

pyvenv env

安裝應用程式所需的任何外部封裝。 您可以在儲存機制的根目錄使用 requirements.txt 檔案,在虛擬環境中安裝封裝:

env/bin/pip install -r requirements.txt

建立超級使用者

應用程式包含的資料庫並沒有定義任何超級使用者。 若要使用應用程式登入功能或 Django 管理介面 (如果您決定要啟用它),您必須建立超級使用者。

從您專案資料夾的命令列執行:

env/bin/python manage.py createsuperuser

請依照下列提示來設定使用者名稱、密碼等等。

使用開發伺服器來執行

您可以使用下列命令,在開發伺服器下啟動應用程式:

env/bin/python manage.py runserver

主控台會顯示 URL,以及伺服器接聽的通訊埠:

然後,開啟網頁瀏覽器指向該 URL。

進行變更

現在您可以嘗試對應用程式來源和/或範本進行變更。

測試過您的變更之後,請將它們認可至 Git 儲存機制:

git add <modified-file>
git commit -m "<commit-comment>"

安裝更多封裝

您的應用程式可能會擁有 Python 和 Django 之外的相依性。

您可以使用 pip 安裝其他封裝。 例如,若要安裝 Azure SDK for Python,讓您可存取 Azure 儲存體、服務匯流排和其他 Azure 服務,請輸入:

env/bin/pip install azure

請務必更新 requirements.txt:

env/bin/pip freeze > requirements.txt

認可變更:

git add requirements.txt
git commit -m "Added azure package"

部署至 Azure

若要觸發部署,將變更推送至 Azure:

git push azure master

您會看到部署指令碼的輸出,包括虛擬環境建立、安裝封裝、建立 web.config。

瀏覽至 Azure URL,以檢視您的變更。

疑難排解 - 封裝安裝

在 Azure 上執行時,有些封裝可能無法使用 PIP 安裝。 這可能只是因為在 Python 封裝索引上無法使用該封裝。 這可能是需要有編譯器 (在 Azure App Service 中執行 Web 應用程式的電腦上無法使用編譯器)。

在本節中,我們將探討如何處理這個問題。

要求 Wheel

如果封裝安裝需要編譯器,您應該嘗試連絡封裝擁有者,要求提供適用於封裝的 Wheel。

透過最近上市的 Microsoft Visual C++ Compiler for Python 2.7,現在建置擁有 Python 2.7 原生程式碼的套件更容易。

建置 Wheel (需要 Windows)

注意:使用此選項時,請務必使用符合 Azure App Service 中 Web 應用程式上使用之平台/架構/版本 (Windows/32 位元/2.7 或 3.4) 的 Python 環境編譯封裝。

如果封裝因為需要編譯器而無法安裝,您可以在本機電腦上安裝編譯器,並建置封裝的 Wheel,然後將其包含在您的儲存機制中。

Mac/Linux 使用者:如果您無法存取 Windows 電腦,請參閱 建立執行 Windows 的虛擬機器,了解如何在 Azure 上建立虛擬機器。 您可以使用該虛擬機器建置 Wheel、將它們加入至儲存機制,以及在您想要捨棄虛擬機器時捨棄。

對於 Python 2.7,您可以安裝 Microsoft Visual C++ Compiler for Python 2.7

對於 Python 3.4,您可以安裝 Microsoft Visual C++ 2010 Express

若要建置 Wheel,您需要有 Wheel 封裝:

env\scripts\pip install wheel

您將使用 pip wheel 編譯相依性:

env\scripts\pip wheel azure==0.8.4

這會在 \wheelhouse 資料夾中建立一個 .whl 檔。 將 \wheelhouse 資料夾與 Wheel 檔案加入至您的儲存機制。

編輯 requirements.txt 以便在頂端加入 --find-links 選項。 這會告訴 PIP 尋找本機資料夾中完全相符的項目,才能進入 Python 封裝索引。

--find-links wheelhouse
azure==0.8.4

如果您想要在 \wheelhouse 資料夾中包含所有相依性,而且完全不使用 Python 封裝索引,您可以將 --no-index 加入至 requirements.txt 的頂端,以強制 PIP 忽略封裝索引。

--no-index

自訂安裝

您可以自訂部署指令碼,以使用替代的安裝程式 (例如 easy_install) 在虛擬環境中安裝套件。 如需已標成註解的範例,請參閱 deploy.cmd。 請確定這類封裝未列在 requirements.txt 中,以避免 PIP 安裝這類封裝。

將以下加入至部署指令碼:

env\scripts\easy_install somepackage

您也可以使用 easy_install,從 exe 安裝程式 (某些與 zip 相容,因此 easy_install 支援它們) 安裝。 將安裝程式新增至您的儲存機制,並傳遞可執行檔的路徑以叫用 easy_install。

將以下加入至部署指令碼:

env\scripts\easy_install "%DEPLOYMENT_SOURCE%\installers\somepackage.exe"

在儲存機制中包含虛擬環境 (需要有 Windows)

注意:使用此選項時,請務必使用符合 Azure App Service 中 Web 應用程式上使用之平台/架構/版本 (Windows/32 位元/2.7 或 3.4) 的虛擬環境。

如果您在儲存機制中包含虛擬環境,可以防止部署指令碼透過建立空白檔案,在 Azure 上管理虛擬環境:

.skipPythonDeployment

建議您刪除應用程式上現有的虛擬環境,以防止在自動管理虛擬環境時遺留檔案。

疑難排解 - 虛擬環境

如果部署指令碼偵測到相容的虛擬環境已經存在,將會略過在 Azure 上建立虛擬環境。 這樣做會大幅加速部署。 PIP 將會略過已安裝的封裝。

在某些情況下,您可能需要強制刪除該虛擬環境。 如果您決定在儲存機制中包含虛擬環境,就需要這麼做。 如果您要去除特定封裝,或測試 requirements.txt 的變更,也可能需要這麼做。

在 Azure 上管理現有的虛擬環境有幾個選項:

選項 1:使用 FTP

使用 FTP 用戶端連線到伺服器,您將能夠刪除 env 資料夾。 請注意,某些 FTP 用戶端 (例如網頁瀏覽器) 可能是唯讀的,而且不允許您刪除資料夾,因此請您務必使用具有該功能的 FTP 用戶端。 FTP 主機名稱和使用者會顯示在 Azure 入口網站上您 Web 應用程式的刀鋒視窗中。

選項 2:切換執行階段

以下是部署指令碼不符合所需的 Python 版本時,部署指令碼刪除 env 資料夾所使用的替代方案。 這將會有效地刪除現有的環境,並建立一個新的環境。

  1. 切換至不同的 Python 版本 (透過 runtime.txt 或 Azure 入口網站中的 [應用程式設定] 刀鋒視窗)
  2. Git 推送部分變更 (忽略任何 PIP 安裝錯誤 (如果有的話))
  3. 切換回最初的 Python 版本
  4. 再次 Git 推送部分變更

選項 3:自訂部署指令碼

如果您已自訂部署指令碼,可以變更 deploy.cmd 中的程式碼,以強制它刪除 env 資料夾。

疑難排解 - 靜態檔案

Django 具有收集靜態檔案的概念。 這會從原始位置取得所有靜態檔案,並將它們複製到單一資料夾。 針對此應用程式,它們會複製到 /static

這是因為靜態檔案可能來自不同的 Django「應用程式」。 例如,Django 管理介面的靜態檔案位於虛擬環境中的 Django 程式庫子資料夾。 此應用程式所定義的靜態檔案位於 /app/static。 當您使用多個 Django「應用程式」時 ,您必須擁有位於多個位置中的靜態檔案。

當在偵錯模式中執行應用程式,應用程式會從其原始位置提供靜態檔案。

在發行模式中執行應用程式,應用程式 不會 提供靜態檔案。 Web 伺服器的責任就是提供檔案。 針對此應用程式,IIS 將會從 /static提供靜態檔案。

靜態檔案的集合會做為部署指令碼的一部分自動完成,清除先前收集的檔案。 這表示此集合會發生在每個部署上、稍微降低部署速度,但它可確保已過時的檔案無法使用,避免潛在的安全性問題。

如果您想要跳過 Django 應用程式的靜態檔案收集:

\.skipDjango

那麼您必須要在本機電腦,手動執行收集:

env\scripts\python manage.py collectstatic

然後從 .gitignore 移除 \static 資料夾,並將它加入至 Git 儲存機制。

疑難排解 - 設定

應用程式的各種設定可以在 DjangoWebProject/settings.py變更。

為了開發人員方便起見,已啟用偵錯模式。 其中一項不錯的副作用是,您能在本機執行時看見映像和其他靜態內容,而不需要收集靜態檔案。

若要停用偵錯模式:

DEBUG = False

停用偵錯時,需要更新 ALLOWED_HOSTS 值以包含 Azure 主機名稱。 例如:

ALLOWED_HOSTS = (
    'pythonapp.azurewebsites.net',
)

或啟用任何:

ALLOWED_HOSTS = (
    '*',
)

在實務上,您可能希望進行更複雜的操作,以應付在偵錯和發行模式之間切換,以及取得主機名稱。

您可以透過 Azure 入口網站中的 [設定] 頁面來設定環境變數 (在 [應用程式設定] 區段中)。 這對設定您不想要顯示於來源 (連接字串、密碼等等) 中的值,或是您想要 Azure 與本機電腦有不同設定時很有幫助。 在 settings.py 中,您可以使用 os.getenv 查詢環境變數。

使用資料庫

應用程式隨附的資料庫為 SQLite 資料庫 這是用於開發、方便實用的預設資料庫,因為它幾乎不需要設定。 資料庫會儲存在專案資料夾中的 db.sqlite3 檔案。

Azure 提供了資料庫服務,可從 Django 應用程式輕鬆使用。 從 Django 應用程式使用 SQL DatabaseMySQL 的教學課程,會示範建立資料庫服務、在 DjangoWebProject/settings.py 中變更資料庫設定,以及必須安裝組件庫的必要步驟。

當然,如果您偏好管理您自己的資料庫伺服器,您可以使用在 Azure 上執行的 Windows 或 Linux 的虛擬機器做到這點。

Django 管理介面

一旦您開始建置您的模型,您會想要在資料庫內填入一些資料。 使用 Django 管理介面可利用互動的方式,輕鬆新增並管理內容。

已取消註解應用程式來源中的管理介面程式碼,但已清楚標示,您可以輕鬆啟用它 (搜尋 'admin')。

啟用後,同步處理資料庫、執行應用程式並瀏覽至 /admin

後續步驟

請遵循下列連結以深入了解 Django 和 Python Tools for Visual Studio:

如需使用 SQL Database 和 MySQL 的資訊:

如需詳細資訊,請參閱 Python 開發人員中心

變更的項目