如果想把一個應用( web-poll) 變成一個獨立的Python包,在新項目中重用,并與他人共享。
可重用性很重要
設計、構建、測試和維護web應用程序有很多工作要做。許多Python和Django項目都有共同的問題。如果我們能挽救一些重復的工作,豈不是很好?
可重用性是Python中的生命方式。Python包索引(PyPI)有大量的包,您可以在自己的Python程序中使用。看看你可以在你的項目中加入的現有可重用應用程序的Django包。Django本身也是一個Python包。這意味著您可以使用現有的Python包或Django應用程序,并將它們組合到您自己的web項目中。您只需要編寫使您的項目獨一無二的部分。
假設你正在啟動一個新項目,它需要一個像我們一直在做的調查應用。如何使這個應用程序可重用?
package 和 app的區別
package
Python包提供了一種分組相關Python代碼的方法,以便易于重用。一個包裹包含一個或多個Python代碼的文件(也稱為“模塊”)。
包的引用方式:
- import foo.bar or from foo import bar.
- For a directory (like polls) to form a package, it must contain a special file init.py, even if this file is empty.
app
Django應用程序只是一個Python包,專門用于Django項目中。應用程序可以使用常見的Django約定,例如擁有models、test、urls 和views 子模塊。
項目和可重用的應用程序:
現在,polls 目錄可以被復制到一個新的Django項目中,并立即重新使用。不過,它還沒有完全準備好發表。為此,我們需要打包應用程序,讓其他人更容易安裝。
前提準備工作
Python包裝的當前狀態與各種工具有些混亂。我們將使用setuptools來構建包裹。它是推薦的打包工具(與distribute叉合并)。我們還將使用pip來安裝和卸載它。您現在應該安裝這兩個軟件包, 您可以參考如何用pip安裝Django。您可以以同樣的方式安裝setuptools。
打包應用程序
Python打包是指以一種易于安裝和使用的特定格式來準備您的應用程序。Django本身就是這樣打包的。對于像 polls 這樣的小型應用來說,這個過程并不太難。
- 首先,在Django項目之外為 polls 創建一個父目錄。這個目錄django-polls。
為你的應用選擇一個名字
在為軟件包選擇名稱時,請檢查像PyPI這樣的資源,以避免與現有軟件包命名沖突。在創建分發包時,預先將django-放在您的模塊名稱中是很有用的。這可以幫助其他尋找Django應用的人識別你的應用程序。
應用程序標簽(即應用程序包的虛線的最后一部分)必須在INSTALLED_APPS中是唯一的。避免使用與Django發明包相同的標簽,例如auth, admin, messages。
將polls目錄移動到django-poll目錄中。
創建一個文件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
Add "polls" to your INSTALLED_APPS setting like this::
INSTALLED_APPS = [
...
'polls',
]Include the polls URLconf in your project urls.py like this::
path('polls/', include('polls.urls')),Run
python manage.py migrate
to create the polls models.Start the development server and visit http://127.0.0.1:8000/admin/
to create a poll (you'll need the Admin app enabled).Visit http://127.0.0.1:8000/polls/ to participate in the poll.
- 創建一個 django-polls /LICENSE 。選擇許可證超出了本教程的范圍,但足以說明沒有許可證公開發布的代碼是無用的。Django和許多與django-兼容的應用程序都是在BSD許可下發布的;然而,你可以自由選擇自己的license。請注意,您的許可選擇將影響誰能夠使用您的代碼。
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',
],
)
- 默認情況下,只有Python模塊和包裹包含在包中。為了包含更多的文件,我們需要創建一個MANIFEST.in。在文件中。在前面的步驟中提到的setuptools文檔更詳細地討論了這個文件。包括模板,README.rst 和我們的LCENSE文件,創建一個文件django-polls/MANIFEST.in。以下內容:
django-polls/MANIFEST.in
include LICENSE
include README.rst
recursive-include polls/static *
recursive-include polls/templates *
-
它是可選的,但是推薦的,可以在你的應用中包含詳細的文檔。為將來的文檔創建一個空目錄django-polls/docs。在django-polls/MANIFEST.in中添加一條額外的行。
recursive-include docs *
注意,除非您向它添加一些文件,否則docs目錄不會包含在您的包中。許多Django應用程序還可以通過readthedocs.org等網站提供他們的文檔。
- 嘗試用python設置構建軟件包。 with python setup.py sdist (run from inside django-polls). 這將創建一個名為“dist”的目錄,并構建您的新包,django-poll-0.1.tar.gz。
Using your own package
由于我們將 polls 目錄移出了項目,所以它不再工作了?,F在,我們將通過安裝新的django-poll包來解決這個問題。
作為用戶庫安裝
下面的步驟將django-poll作為用戶庫安裝。每個用戶的安裝比在系統范圍內安裝包有很多優勢,比如在沒有管理員訪問的系統上可用,以及防止軟件包影響系統服務和其他用戶。
注意,每個用戶的安裝仍然可以影響作為該用戶運行的系統工具的行為,因此virtualenv是一個更健壯的解決方案(見下文)。
- 要安裝軟件包,請使用pip(您已經安裝了它,對嗎?)
pip install --user django-polls/dist/django-polls-0.1.tar.gz
-
幸運的是,Django項目現在應該再次正常工作。再次運行服務器來確認這一點。
image.png 要卸載軟件包,請使用pip:
pip uninstall django-polls