Python Instance
具備知識
- 了解 Python 程式語言與 WSGI 協定
- 您的專案必須使用 WSGI
- 了解 Git
版本支援
在撰寫本文的同時,我們的 Python instance 可支援 Python 2.7(預設使用) 與 3.2 的版本。我們依循了 Debian 套件 Wheezy 版本的更新。如果您的應用程式必須指定 Python 版本,請參考下方的 "選擇 Python 版本"。
基礎使用
您的 Python 專案必須至少包含一個 wsgi.py 的檔案,這個檔案本身包含應用程式的物件,根據 PEP 協議撰寫: http://www.python.org/dev/peps/pep-0333/#the-application-framework-side
虛擬站台
與 PHP instance 不同的是,您在 Gandi 的介面中增加一個虛擬站台並不會在 Instance 中增加一個對應的目錄來存放程式碼。在 Instance 中只有一個 “default” 的虛擬站台來存放您的應用程式程式碼。另外,相對於其他 Instance 類型,每台 Python instance 只能存放一個應用程式。 您可以用 “default” 這個應用程式來控制讀取不同的虛擬站台,藉此來達到相同的虛擬站台效果。
這將會需要在 DNS 中增加不同的網址並指向 instance,這裡可以找到相關說明: 將 DNS 指向 instance
範例如下:
Directory layout
.
└── wsgi.py
wsgi.py:
def application(environ, start_response): start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')]) return ['<!DOCTYPE html><html><meta charset="utf-8"><title>It works', '</title><h1>It works!</h1>']
應用程式相依性
您應用程式的相依套件將會透過 “pip” 的方式安裝,並且會安裝 “requirements.txt” 這個檔案中所指定的相依性套件。您必須使用 Git 來佈署您的程式碼,相依套件才會自動安裝。就跟您在本地電腦佈署程式碼時透過 “pip install” 安裝一樣。當您的應用軟體準備要上線時,請在本地端執行下列指令來產生一個檔案會包含所有相依套件的資訊:
$ pip freeze > requirements.txt
這個指令會將您開發環境中的模組與相依套件都匯出到 requirements.txt
這個檔案,將這個檔案放置到 Simple Hosting instance 的對應位置,放置到 'default' 的最上層就可以保證您的應用程式在佈署的時候自動安裝其相依性。您必須使用 Git 來 commit 與 push 這個檔案到 instance 上。
其他更多資訊請參考:
http://www.pip-installer.org/en/latest/cookbook.html#requirements-files
關於如何使用 Git 來佈署您的專案,請參考:使用 Git 存取
選擇 Python 版本
您可以自行選擇一個我們提供的 Python 版本來執行您的應用程式。接下來,您將需要在您的專案根目錄中建立一個 “gandi.yml” 的檔案,並在其中用 “python” 欄位指定版本即可:
gandi.yml
python: version: 3.2
上面的範例將會使用 Python 3.2 來執行您的應用程式。如果檔案中沒有指定 Python 欄位或是 yaml 格式錯誤,則會執行預設的版本。如果您指定了一個不存在的版本,您的應用程式將不會執行並且會在 instance 的佈署日誌檔 (log) 中看見相關的錯誤訊息。
靜態檔案
將所有的靜態內容放置到 '/static/' 與 '/media/' 資料夾內,這樣 Apache 就可以存取他們。
日誌檔
您應用程式的錯誤訊息會輸出到 instance 硬碟上的下列位置:
- 從 SSH 登入: /srv/data/var/log/www/uwsgi.log
- 從 SFTP 登入: /lamp0/var/log/www/uwsgi.log
您可以使用上述的檔案來觀察您的應用程式是否成功啟動。
您也可以自訂關於日誌檔的選項來符合您的需求。在 'default' 裡面增加 'loggin.ini' 這個檔案來完成設定。
更多詳情請參閱:
範例
Flask 應用程式的範例
https://github.com/mitsuhiko/flask/tree/master/examples/minitwit
Directory layout
.
├── minitwit.py
├── requirements.txt
├── static/
├── templates/
└── wsgi.py
wsgi.py:
from minitwit import app as application
requirements.txt:
flask
Django 的範例
Directory layout
.
├── media/
├── cms/
│ ├── manage.py
│ └── cms/
│ ├── init.py
│ ├── settings.py
│ ├── templates/
│ └── urls.py
├── requirements.txt
├── static/
└── wsgi.py
wsgi.py:
import sys import os import os.path sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), 'cms'))) os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'cms.settings') from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
requirements.txt:
django-cms