Django 官網(wǎng)最新 Tutorial 渣翻 - Part 8(進(jìn)階教程)

上一節(jié):Django 官網(wǎng)最新 Tutorial 渣翻 - Part 7

進(jìn)階教程:如何編寫可重用的應(yīng)用程序

這個(gè)進(jìn)階教程上接 Tutorial 7。 我們將把我們的網(wǎng)頁投票轉(zhuǎn)換成一個(gè)獨(dú)立的Python包幸撕,這樣你可以在其它項(xiàng)目中重用或者分享給其它人。

如果您最近沒有完成教程1-7泵额,我們建議您先看他們,以使您的示例項(xiàng)目與下面描述的項(xiàng)目相匹配。

可重用性很重要

設(shè)計(jì)这难、構(gòu)建仔燕、測試和維護(hù)一個(gè)網(wǎng)頁應(yīng)用有許多工作要做造垛。 許多Python 和 Django 項(xiàng)目都有常見的共同問題。 可重用將會(huì)節(jié)省這些重復(fù)性工作晰搀。

可重用性在Python 中是一種常見的方式五辽。 Python包索引 (PyPI) 具有廣泛的包,你可以在你自己的Python程序中使用外恕。 查閱一下Django 包 中已經(jīng)存在的可重用的應(yīng)用杆逗,你可以結(jié)合它們到你的項(xiàng)目。 Django 自身也只是一個(gè)Python 包鳞疲。 這意味著你可以獲取已經(jīng)存在的Python包和Django應(yīng)用并將它們?nèi)诤系侥阕约旱木W(wǎng)頁項(xiàng)目罪郊。 你只需要編寫你項(xiàng)目的獨(dú)特的部分。

假設(shè)您正在開始一個(gè)新項(xiàng)目建丧,需要一個(gè)像我們一直在進(jìn)行的投票應(yīng)用程序排龄。 你如何讓該應(yīng)用可重用? 幸運(yùn)的是,你已經(jīng)在正確的道路上橄维。 在 Tutorial 3中尺铣,我們看到我們可以如何使用include將投票應(yīng)用從項(xiàng)目級別的URLconf 解耦。 在本教程中争舞,我們將更進(jìn)一步,讓你的應(yīng)用在新的項(xiàng)目中容易地使用并隨時(shí)可以發(fā)布給其它人安裝和使用竞川。

包店溢? 應(yīng)用?
Python 按照簡單重用的方式委乌,將具有相關(guān)性的Python代碼歸為一組床牧。 一個(gè)包包含一個(gè)或多個(gè)Python文件(也叫做“模塊”)。
包可以通過import foo.barfrom foo import bar 導(dǎo)入遭贸。 如果一個(gè)目錄(例如polls)想要形成一個(gè)包戈咳,它必須包含一個(gè)特殊的文件__init__.py,即使這個(gè)文件為空壕吹。
一個(gè)Django 應(yīng)用 只是一個(gè)Python包著蛙,它特意用于Django項(xiàng)目中。 一個(gè)應(yīng)用可以使用常見的Django 約定耳贬,例如具有urls踏堡、testsmodelsviews 子模塊咒劲。
后面我們使用打包這個(gè)詞來描述將一個(gè)Python包變得讓其他人易于安裝的過程顷蟆。 這可能有點(diǎn)讓人覺得困惑。


您的項(xiàng)目和您的可重用應(yīng)用程序

經(jīng)過前面的教程之后缎患,我們的項(xiàng)目應(yīng)該看上去像這樣:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        migrations/
            __init__.py
            0001_initial.py
        models.py
        static/
            polls/
                images/
                    background.gif
                style.css
        templates/
            polls/
                detail.html
                index.html
                results.html
        tests.py
        urls.py
        views.py
    templates/
        admin/
            base_site.html

你在 Tutorial 3Tutorial 7中創(chuàng)建了polls/templatesmysite/templates慕的。 現(xiàn)在你可能更加清晰為什么我們?yōu)轫?xiàng)目和應(yīng)用選擇單獨(dú)的模板目錄:屬于投票應(yīng)用的部分全部在polls中。 它使得該應(yīng)用“自包含(self-contained)”且更加容易丟到一個(gè)新的項(xiàng)目中挤渔。

現(xiàn)在可以拷貝polls目錄到一個(gè)新的Django項(xiàng)目并立即重用。 盡管它還不能充分準(zhǔn)備好到可以立即發(fā)布风题。 所以判导,我們需要打包這個(gè)應(yīng)用來讓它對其他人易于安裝。

安裝一些先決條件

Python 打包的目前狀態(tài)因?yàn)橛卸喾N工具而混亂不堪沛硅。 對于本教程眼刃,我們打算使用setuptools來構(gòu)建我們的包。 它是推薦的打包工具(已經(jīng)與distribute 分支合并)摇肌。 我們還將使用pip來安裝和卸載它擂红。 現(xiàn)在你應(yīng)該安裝這兩個(gè)包。 如果你需要幫助围小,你可以參考 how to install Django with pip昵骤。 你可以使用同樣的方法安裝setuptools树碱。


打包您的應(yīng)用程序

Python 打包 會(huì)將你的應(yīng)用預(yù)處理成一種特殊的格式, 這樣安裝和使用就會(huì)變得簡單变秦。 Django 自己是以非常相似的方式打包起來的成榜。 對于一個(gè)像polls這樣的小應(yīng)用,這個(gè)過程不是太難蹦玫。

  1. 首先赎婚,在你的Django項(xiàng)目之外,為polls創(chuàng)建一個(gè)父目錄樱溉。 稱這個(gè)目錄為django-polls挣输。

為你的應(yīng)用選擇一個(gè)名字
當(dāng)為你的包選擇一個(gè)名字時(shí),檢查一下PyPI中的資源以避免與已經(jīng)存在的包有名字沖突福贞。 當(dāng)創(chuàng)建一個(gè)要發(fā)布的包時(shí)歧焦,在你的模塊名字前面加上django-通常很有用。 這有助于其他正在查找Django應(yīng)用的人區(qū)分你的應(yīng)用是專門用于Django的肚医。
應(yīng)用程序標(biāo)簽(即應(yīng)用程序包的虛線路徑的最后一部分)必須INSTALLED_APPS中是唯一的绢馍。 避免使用與Django的contrib 包 中任何一個(gè)使用相同的標(biāo)簽,例如admin肠套、authmessages舰涌。

  1. 將polls 目錄移動(dòng)到django-polls目錄中。

  2. 創(chuàng)建一個(gè)包含以下內(nèi)容的文件django-polls/README.rst:

django-polls/README.rst

=====
Polls
=====

Polls is a simple Django app to conduct Web-based polls. For each
question, visitors can choose between a fixed number of answers.

Detailed documentation is in the "docs" directory.

Quick start
-----------

1. Add "polls" to your INSTALLED_APPS setting like this::

    INSTALLED_APPS = [
        ...
        'polls',
    ]

2. Include the polls URLconf in your project urls.py like this::

    path('polls/', include('polls.urls')),

3. Run `python manage.py migrate` to create the polls models.

4. Start the development server and visit http://127.0.0.1:8000/admin/
   to create a poll (you'll need the Admin app enabled).

5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.
  1. 創(chuàng)建一個(gè)django-polls/LICENSE文件你稚。 如何選擇License超出本教程的范圍瓷耙,但值得一說的是, 公開發(fā)布的代碼如果沒有License是毫無用處的。 Django和許多Django兼容的應(yīng)用程序是根據(jù)BSD許可證分發(fā)的刁赖;但是搁痛,您可以自由選擇自己的許可證。 只需知道你所選擇的License,將決定誰能使用你的代碼.

  2. 下一步我們將創(chuàng)建一個(gè)setup.py 文件宇弛,它提供如何構(gòu)建和安裝該應(yīng)用的詳細(xì)信息鸡典。 該文件完整的解釋超出本教程的范圍,setuptools 文檔 有很好的解釋枪芒。 創(chuàng)建一個(gè)文件django-polls/setup.py彻况,其內(nèi)容如下:

django-polls/setup.py

import os
from setuptools import find_packages, setup

with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme:
    README = readme.read()

# allow setup.py to be run from any path
os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir)))

setup(
    name='django-polls',
    version='0.1',
    packages=find_packages(),
    include_package_data=True,
    license='BSD License',  # example license
    description='A simple Django app to conduct Web-based polls.',
    long_description=README,
    url='https://www.example.com/',
    author='Your Name',
    author_email='yourname@example.com',
    classifiers=[
        'Environment :: Web Environment',
        'Framework :: Django',
        'Framework :: Django :: X.Y',  # replace "X.Y" as appropriate
        'Intended Audience :: Developers',
        'License :: OSI Approved :: BSD License',  # example license
        'Operating System :: OS Independent',
        'Programming Language :: Python',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3.6',
        'Topic :: Internet :: WWW/HTTP',
        'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
    ],
)
  1. 默認(rèn)只有Python模塊和包會(huì)包含進(jìn)包中。 如果需要包含額外的文件舅踪,我們需要?jiǎng)?chuàng)建一個(gè)MANIFEST.in文件纽甘。 上一步提到的setuptools 文檔對這個(gè)文件有更詳細(xì)的討論。 如果要包含模板抽碌、django-polls/MANIFEST.in和我們的LICENSE 文件悍赢,創(chuàng)建一個(gè)文件README.rst,其內(nèi)容如下:
django-polls/MANIFEST.in

include LICENSE
include README.rst
recursive-include polls/static *
recursive-include polls/templates *
  1. 這是可選的,但建議您在應(yīng)用程序中包含詳細(xì)的文檔左权。 創(chuàng)建一個(gè)空目錄django-polls/docs以供將來使用皮胡。 向django-polls/MANIFEST.in添加另外一行:
recursive-include docs *

注意docs不會(huì)包含進(jìn)你的包中除非你添加一些文件到它下面。 許多Django應(yīng)用還通過類似readthedocs.org這樣的站點(diǎn)提供它們的在線文檔.

  1. 試著通過python setup.py sdist 構(gòu)建你的包(從django-polls的內(nèi)部運(yùn)行)涮总。 這會(huì)創(chuàng)建一個(gè)django-polls-0.1.tar.gz目錄并構(gòu)建一個(gè)新包:dist胸囱。

更多關(guān)于打包的信息,參見Python 的 打包和分發(fā)項(xiàng)目的教程瀑梗。


使用你自己的包

因?yàn)榕氡剩覀儗?code>polls 目錄移到項(xiàng)目的目錄之外,它不再工作了抛丽。 我們將通過安裝我們的新的django-polls包來修復(fù)它谤职。

安裝成某個(gè)用戶的庫
以下的步驟將安裝django-polls 成某個(gè)用戶的庫。 用戶級別的安裝比系統(tǒng)級別的安裝有許多優(yōu)點(diǎn)亿鲜,例如將包運(yùn)行在普通用戶級別上不但不會(huì)影響系統(tǒng)服務(wù)還不會(huì)影響其他用戶
注意根據(jù)用戶的安裝仍然可以影響以該用戶身份運(yùn)行的系統(tǒng)工具允蜈,所以virtualenv 是更健壯的解決辦法(見下文)。

  1. 要安裝軟件包蒿柳,請使用pip(您已經(jīng)installed it饶套,對吧?):
pip install --user django-polls/dist/django-polls-0.1.tar.gz
  1. 幸運(yùn)的話垒探,你的Django 項(xiàng)目現(xiàn)在應(yīng)該又能正常工作了妓蛮。 請重新運(yùn)行服務(wù)器以證實(shí)這點(diǎn)。

  2. 若要卸載這個(gè)包圾叼,使用pip:

pip uninstall django-polls

發(fā)布您的應(yīng)用程序

既然我們已經(jīng)打包并測試過django-polls蛤克,是時(shí)候與世界共享它了! 如果它不僅僅是個(gè)例子夷蚊,你現(xiàn)在可以:


使用 virtualenv 安裝Python包

前面呜笑,我們將poll 安裝成一個(gè)用戶的庫夫否。 它有一些缺點(diǎn):

  • 修改這個(gè)用戶的庫可能影響你的系統(tǒng)上的其它Python 軟件。
  • 你將不可以運(yùn)行這個(gè)包的多個(gè)版本(或者具有相同名字的其它包)叫胁。

特別是一旦你維護(hù)幾個(gè)Django項(xiàng)目,這些情況就會(huì)出現(xiàn)汞幢。 如果確實(shí)出現(xiàn)驼鹅,最好的解決辦法是使用virtualenv。 這個(gè)工具允許你維護(hù)多個(gè)分離的Python環(huán)境,每個(gè)都具有它自己的庫和包的命名空間输钩。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豺型,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子买乃,更是在濱河造成了極大的恐慌姻氨,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剪验,死亡現(xiàn)場離奇詭異肴焊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)功戚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門娶眷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人啸臀,你說我怎么就攤上這事届宠。” “怎么了乘粒?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵豌注,是天一觀的道長。 經(jīng)常有香客問我灯萍,道長轧铁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任竟稳,我火速辦了婚禮属桦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘他爸。我一直安慰自己聂宾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布诊笤。 她就那樣靜靜地躺著系谐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讨跟。 梳的紋絲不亂的頭發(fā)上纪他,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音晾匠,去河邊找鬼茶袒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凉馆,可吹牛的內(nèi)容都是我干的薪寓。 我是一名探鬼主播亡资,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼向叉!你這毒婦竟也來了锥腻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤母谎,失蹤者是張志新(化名)和其女友劉穎瘦黑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奇唤,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幸斥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冻记。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睡毒。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冗栗,靈堂內(nèi)的尸體忽然破棺而出演顾,到底是詐尸還是另有隱情,我是刑警寧澤隅居,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布钠至,位于F島的核電站,受9級特大地震影響胎源,放射性物質(zhì)發(fā)生泄漏棉钧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一涕蚤、第九天 我趴在偏房一處隱蔽的房頂上張望宪卿。 院中可真熱鬧,春花似錦万栅、人聲如沸佑钾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽休溶。三九已至,卻和暖如春扰她,著一層夾襖步出監(jiān)牢的瞬間兽掰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工徒役, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孽尽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓忧勿,卻偏偏與公主長得像泻云,于是被迫代替她去往敵國和親艇拍。 傳聞我的和親對象是個(gè)殘疾皇子狐蜕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348