Flask 部署和分發(fā)

2021-08-11 09:56 更新

distribute 的前身是 setuptools ,是一個(gè)通常用于分發(fā) Python 庫和擴(kuò)展程序的外部庫。它依賴于隨 Python 預(yù)裝的 distutils 庫, 而后者則是一個(gè)基礎(chǔ)的模塊安裝系統(tǒng),這一安裝系統(tǒng)也支持很多復(fù)雜的構(gòu)造,使得 大型應(yīng)用更易于分發(fā)。

  • 支持依賴關(guān)系管理: 一個(gè)庫可以聲明自己依賴哪些軟件包,從而在安裝這個(gè) 模塊的時(shí)候,自動(dòng)將依賴的軟件包也安裝到您的計(jì)算機(jī)。
  • 注冊軟件包: setuptools 將您的包注冊到您的安裝的 Python 環(huán)境中。 這使得您可以使一個(gè)包中的代碼查詢另一個(gè)包所提供的信息。這一系統(tǒng)最知名的 特性就是對接口機(jī)制的支持,也就是說一個(gè)包可以聲明自己的一個(gè)接口,從而允許 其他的包通過這個(gè)接口對自己進(jìn)行擴(kuò)展。
  • 安裝包管理器: easy_install 默認(rèn)隨 Python 安裝,它可以用于為您安裝其他 的庫。您也可以使用 pip 這個(gè)可能早晚會(huì)代替 easy_install 的包管理器,它能夠 完成安裝軟件包之外更多的任務(wù)。

而對于 Flask 自己,則所有您可以在 cheessshop 上找到的軟件包,都隨著 distribute 分發(fā)管理器,或者更古老的 setuptools 和 distutils 分發(fā)。

在這里,我們假定您的應(yīng)用名為 yourapplication.py ,而您沒使用模塊而是使用 package 的結(jié)構(gòu)來組織代碼。分發(fā)帶有標(biāo)準(zhǔn)模塊的 代碼不被 distribute 支持,所以我們不去管它。如果您還沒有將您的應(yīng)用轉(zhuǎn)化為包的形式, 請參考前文 大型應(yīng)用 的內(nèi)容查找如何做到這件事。

利用 distribute 完成一個(gè)有效的部署進(jìn)行更復(fù)雜和更自動(dòng)化的部署方案的第一步, 如果您使程序完全自動(dòng)化,可以閱讀 使用 Fabric 部署 這一章。

基礎(chǔ)的安裝腳本

因?yàn)槟阋呀?jīng)讓 Flask 運(yùn)行起來了,所以不管怎么說您的系統(tǒng)上應(yīng)該會(huì)有 setuptools 或者d istribute,如果你沒有這兩樣,不要害怕。這里幫你準(zhǔn)備了一個(gè)腳本: distribute_setup.py 你只需要下載并用 Python 解釋器運(yùn)行它。

考慮這些操作可能會(huì)有風(fēng)險(xiǎn),因此建議您參考 你最好使用 virtualenv 一文。

您的安裝代碼將總是保存在與您應(yīng)用同目錄下的 setup.py 文件中。為文件 指定這一名稱只是為了方便,不過一般來說每一個(gè)人自然而然的在程序目錄下 尋找這個(gè)文件,所以您最好別改變它。

同時(shí),即使您在使用 distribute ,您也會(huì)導(dǎo)入一個(gè)名為 setuptools 的包。 distribute 完全向下兼容 setuptools ,所以我們也使用這個(gè)名字來導(dǎo)入它。

一個(gè)基本的 Flask 應(yīng)用的 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']
)

切記,您必須詳細(xì)地列出子代碼包,如果您想要 distribute 自動(dòng)為您尋找這些包, 您可以使用 find_packages 函數(shù):

from setuptools import setup, find_packages

setup(
    ...
    packages=find_packages()
)

大多數(shù) setup 函數(shù)當(dāng)中的參數(shù)的意義從字面意思就能看出來,然而 include_package_datazip_safe 可能不在此列。 include_package_data 告訴 distribute 自動(dòng)查找一個(gè) MANIFEST.in 文件。 解析此文件獲得有效的包類型的數(shù)據(jù),并安裝所有這些包。我們使用這個(gè)特性來分發(fā) Python 模塊自帶的靜態(tài)文件和模板(參考 分發(fā)代碼)。而 zip_safe 標(biāo)志可以被用來強(qiáng)制阻止 ZIP 安裝包的建立。通常情況下,您不希望您的包以 ZIP 壓縮 包的形式被安裝,因?yàn)橐恍┕ぞ卟恢С诌@種方式,而且這樣也會(huì)讓調(diào)試代碼異常麻煩。

分發(fā)代碼

如果您視圖安裝您剛剛創(chuàng)建的包,您會(huì)發(fā)現(xiàn)諸如 statictemplates 這樣的 文件夾沒有安裝進(jìn)去。這是因?yàn)?distribute 不知道該把哪些文件添加進(jìn)去。您只要 在 setup.py 相同的文件夾下創(chuàng)建一個(gè) MANIFEST.in 文件,并在此文件中列出 所有應(yīng)該被添加進(jìn)去的文件:

recursive-include yourapplication/templates *
recursive-include yourapplication/static *

不要忘記,即使您已經(jīng)將他們列在 MANIFEST.in 文件當(dāng)中,也需要您將 setup 函數(shù)的 include_package_data 參數(shù)設(shè)置為 True ,否則他們?nèi)匀徊粫?huì)被安裝。

聲明依賴關(guān)系

您需要使用一個(gè)鏈表在 install_requires 參數(shù)中聲明依賴關(guān)系。鏈表的每個(gè)元素是 需要從 PyPI 下載并安裝的包的名字,默認(rèn)將總會(huì)下載安裝最新的的版本。但是您也 可以指定需要的最大和最小的版本區(qū)間。以下是一個(gè)例子:

install_requires=[
    'Flask>=0.2',
    'SQLAlchemy>=0.6',
    'BrokenPackage>=0.7,<=1.0'
]

前文曾經(jīng)指出,這些依賴都從 PyPI 當(dāng)中下載,如果您需要依賴一個(gè)不能在 PyPI 當(dāng)中 被下載的包,比如這個(gè)包是個(gè)內(nèi)部的,您不想與別人分享。這時(shí),您可以依然照原來 那樣將包列在列表里,但是同時(shí)提供一個(gè)包括所有可選下載地址的列表,以便于安裝時(shí) 從這些地點(diǎn)尋找分發(fā)的軟件包:

dependency_links=['http://example.com/yourfiles']

請確認(rèn)那個(gè)頁面包含一個(gè)文件夾列表,且頁面上的連接被指向?qū)嶋H需要下載的軟件包。 distribute 通過掃描這個(gè)頁面來尋找需要安裝的文件,因此文件的名字必須是正確無誤的。 如您有一個(gè)內(nèi)部服務(wù)器包含有這些包,將 URL 指向這個(gè)服務(wù)器。

安裝 / 開發(fā)

安裝您的應(yīng)用(到一個(gè) virtualenv),只需使用 install 指令運(yùn)行 setup.py 即可。 這會(huì)將您的應(yīng)用安裝到一個(gè) virtualenv 的 site-packages 文件夾下面,并且同時(shí) 下載和安裝所有的依賴包:

$ python setup.py install

如果您在進(jìn)行基于這個(gè)包的開發(fā),并且希望安裝開發(fā)所依賴的工具或軟件包, 您可以使用 develop 命令代替 install

$ python setup.py develop

此時(shí)將不會(huì)把您的文件拷貝到 site-packages 文件夾,而僅僅是在那里創(chuàng)建指向 這些文件的文件鏈接。您可以繼續(xù)編輯和修改這些代碼,而無需在每次修改之后 運(yùn)行 install 命令。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)