### 導航
- [索引](# "總目錄")
- [下一頁](# "使用 Fabric 部署") |
- [上一頁](# "使用 URL 處理器") |
- [Flask 0.10.1 文檔](#) ?
- [Flask 代碼模式](#) ?
# 部署和分發
[distribute](http://pypi.python.org/pypi/distribute) [http://pypi.python.org/pypi/distribute] 的前身是 setuptools ,是一個通常用于分發Python 庫和擴展程序的外部庫。它依賴于隨 Python 預裝的 distutils 庫,而后者則是一個基礎的模塊安裝系統,這一安裝系統也支持很多復雜的構造,使得大型應用更易于分發。
- **支持依賴關系管理**: 一個庫可以聲明自己依賴哪些軟件包,從而在安裝這個模塊的時候,自動將依賴的軟件包也安裝到您的計算機。
- **注冊軟件包**: setuptools 將您的包注冊到您的安裝的 Python 環境中。這使得您可以使一個包中的代碼查詢另一個包所提供的信息。這一系統最知名的特性就是對接口機制的支持,也就是說一個包可以聲明自己的一個接口,從而允許其他的包通過這個接口對自己進行擴展。
- **安裝包管理器**: easy_install 默認隨 Python 安裝,它可以用于為您安裝其他的庫。您也可以使用 pip 這個可能早晚會代替 easy_install 的包管理器,它能夠完成安裝軟件包之外更多的任務。
而對于 Flask 自己,則所有您可以在 cheessshop 上找到的軟件包,都隨著 distribute分發管理器,或者更古老的 setuptools 和 distutils 分發。
在這里,我們假定您的應用名為 yourapplication.py ,而您沒使用模塊而是使用[*package*](#) 的結構來組織代碼。分發帶有標準模塊的代碼不被 [distribute](http://pypi.python.org/pypi/distribute) [http://pypi.python.org/pypi/distribute] 支持,所以我們不去管它。如果您還沒有將您的應用轉化為包的形式,請參考前文 [*大型應用*](#) 的內容查找如何做到這件事。
利用 distribute 完成一個有效的部署進行更復雜和更自動化的部署方案的第一步,如果您使程序完全自動化,可以閱讀 [*使用 Fabric 部署*](#) 這一章。
### 基礎的安裝腳本
因為你已經讓 Flask 運行起來了,所以不管怎么說您的系統上應該會有 setuptools或者d istribute,如果你沒有這兩樣,不要害怕。這里幫你準備了一個腳本:distribute_setup.py 你只需要下載并用 Python 解釋器運行它。
考慮這些操作可能會有風險,因此建議您參考 [*你最好使用 virtualenv*](#) 一文。
您的安裝代碼將總是保存在與您應用同目錄下的 setup.py 文件中。為文件指定這一名稱只是為了方便,不過一般來說每一個人自然而然的在程序目錄下尋找這個文件,所以您最好別改變它。
同時,即使您在使用 distribute ,您也會導入一個名為 setuptools 的包。distribute 完全向下兼容 setuptools ,所以我們也使用這個名字來導入它。
一個基本的 Flask 應用的 setup.py 文件看起來像如下這樣:
~~~
from setuptools import setup
setup(
name='Your Application',
version='1.0',
long_description=__doc__,
packages=['yourapplication'],
include_package_data=True,
zip_safe=False,
install_requires=['Flask']
)
~~~
切記,您必須詳細地列出子代碼包,如果您想要 distribute 自動為您尋找這些包,您可以使用 find_packages 函數:
~~~
from setuptools import setup, find_packages
setup(
...
packages=find_packages()
)
~~~
大多數 setup 函數當中的參數的意義從字面意思就能看出來,然而include_package_data 和 zip_safe 可能不在此列。include_package_data 告訴 distribute 自動查找一個 MANIFEST.in 文件。解析此文件獲得有效的包類型的數據,并安裝所有這些包。我們使用這個特性來分發Python 模塊自帶的靜態文件和模板(參考 [*分發代碼*](#))。而 zip_safe標志可以被用來強制阻止 ZIP 安裝包的建立。通常情況下,您不希望您的包以 ZIP 壓縮包的形式被安裝,因為一些工具不支持這種方式,而且這樣也會讓調試代碼異常麻煩。
### 分發代碼
如果您視圖安裝您剛剛創建的包,您會發現諸如 static 和 templates 這樣的文件夾沒有安裝進去。這是因為 distribute 不知道該把哪些文件添加進去。您只要在 setup.py 相同的文件夾下創建一個 MANIFEST.in 文件,并在此文件中列出所有應該被添加進去的文件:
~~~
recursive-include yourapplication/templates *
recursive-include yourapplication/static *
~~~
不要忘記,即使您已經將他們列在 MANIFEST.in 文件當中,也需要您將 setup 函數的include_package_data 參數設置為 True ,否則他們仍然不會被安裝。
### 聲明依賴關系
您需要使用一個鏈表在 install_requires 參數中聲明依賴關系。鏈表的每個元素是需要從 PyPI 下載并安裝的包的名字,默認將總會下載安裝最新的的版本。但是您也可以指定需要的最大和最小的版本區間。以下是一個例子:
~~~
install_requires=[
'Flask>=0.2',
'SQLAlchemy>=0.6',
'BrokenPackage>=0.7,<=1.0'
]
~~~
前文曾經指出,這些依賴都從 PyPI 當中下載,如果您需要依賴一個不能在 PyPI 當中被下載的包,比如這個包是個內部的,您不想與別人分享。這時,您可以依然照原來那樣將包列在列表里,但是同時提供一個包括所有可選下載地址的列表,以便于安裝時從這些地點尋找分發的軟件包:
~~~
dependency_links=['http://example.com/yourfiles']
~~~
請確認那個頁面包含一個文件夾列表,且頁面上的連接被指向實際需要下載的軟件包。distribute 通過掃描這個頁面來尋找需要安裝的文件,因此文件的名字必須是正確無誤的。如您有一個內部服務器包含有這些包,將 URL 指向這個服務器。
### 安裝 / 開發
安裝您的應用(到一個 virtualenv),只需使用 install 指令運行 setup.py 即可。這會將您的應用安裝到一個 virtualenv 的 site-packages 文件夾下面,并且同時下載和安裝所有的依賴包:
~~~
$ python setup.py install
~~~
如果您在進行基于這個包的開發,并且希望安裝開發所依賴的工具或軟件包,您可以使用 develop 命令代替 install
~~~
$ python setup.py develop
~~~
此時將不會把您的文件拷貝到 site-packages 文件夾,而僅僅是在那里創建指向這些文件的文件鏈接。您可以繼續編輯和修改這些代碼,而無需在每次修改之后運行 install 命令。
? 版權所有 2013, Armin Ronacher.
- 歡迎使用 Flask
- 前言
- 給有經驗程序員的前言
- 安裝
- 快速入門
- 教程
- 介紹 Flaskr
- 步驟 0: 創建文件夾
- 步驟 1: 數據庫模式
- 步驟 2: 應用設置代碼
- 步驟 3: 創建數據庫
- 步驟 4: 請求數據庫連接
- 步驟 5: 視圖函數
- 步驟 6: 模板
- 步驟 7: 添加樣式
- 福利: 應用測試
- 模板
- 測試 Flask 應用
- 記錄應用錯誤
- 配置處理
- 信號
- 即插視圖
- 應用上下文
- 請求上下文
- 用藍圖實現模塊化的應用
- Flask 擴展
- 與 Shell 共舞
- Flask 代碼模式
- 大型應用
- 應用程序的工廠函數
- 應用調度
- 使用 URL 處理器
- 部署和分發
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上傳文件
- 緩存
- 視圖裝飾器
- 使用 WTForms 進行表單驗證
- 模板繼承
- 消息閃現
- 用 jQuery 實現 Ajax
- 自定義錯誤頁面
- 延遲加載視圖
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 數據流
- 延遲請求回調
- 添加 HTTP Method Overrides
- 請求內容校驗碼
- 基于 Celery 的后臺任務
- 部署選擇
- mod_wsgi (Apache)
- 獨立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的設計決策
- HTML/XHTML 常見問題
- 安全注意事項
- Flask 中的 Unicode
- Flask 擴展開發
- Pocoo 風格指引
- Python 3 支持
- 升級到最新版本
- Flask Changelog
- 許可證
- 術語表