如果想把一个应用( 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 目录移出了项目,所以它不再工作了。现在,我们将通过安装新的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
网友评论