进阶教程:如何编写可重用的应用程序

这个进阶教程上接 Tutorial 7。 我们将把我们的网页投票转换成一个独立的Python包,这样你可以在其它项目中重用或者分享给其它人。

如果您最近没有完成教程1-7,我们建议您先看他们,以使您的示例项目与下面描述的项目相匹配。

可重用性很重要

设计、构建、测试和维护一个网页应用有许多工作要做。 许多Python 和 Django 项目都有常见的共同问题。 可重用将会节省这些重复性工作。

可重用性在Python 中是一种常见的方式。 Python包索引 (PyPI) 具有广泛的包,你可以在你自己的Python程序中使用。 查阅一下Django 包 中已经存在的可重用的应用,你可以结合它们到你的项目。 Django 自身也只是一个Python 包。 这意味着你可以获取已经存在的Python包和Django应用并将它们融合到你自己的网页项目。 你只需要编写你项目的独特的部分。

include
import foo.barfrom foo import barpolls__init__.pyurlstestsmodelsviews

您的项目和您的可重用应用程序

经过前面的教程之后,我们的项目应该看上去像这样:

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
polls/templatesmysite/templatespolls
polls

安装一些先决条件

distributesetuptools

打包您的应用程序

Python 打包 会将你的应用预处理成一种特殊的格式, 这样安装和使用就会变得简单。 Django 自己是以非常相似的方式打包起来的。 对于一个像polls这样的小应用,这个过程不是太难。

  1. 首先,在你的Django项目之外,为polls创建一个父目录。 称这个目录为django-polls。
  1. 将polls 目录移动到django-polls目录中。

  2. 创建一个包含以下内容的文件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.
setup.pydjango-polls/setup.py
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',
    ],
)
django-polls/MANIFEST.in
django-polls/MANIFEST.in

include LICENSE
include README.rst
recursive-include polls/static *
recursive-include polls/templates *
  1. 这是可选的,但建议您在应用程序中包含详细的文档。 创建一个空目录django-polls/docs以供将来使用。 向django-polls/MANIFEST.in添加另外一行:
recursive-include docs *
docs
  1. 试着通过python setup.py sdist 构建你的包(从django-polls的内部运行)。 这会创建一个django-polls-0.1.tar.gz目录并构建一个新包:dist。

更多关于打包的信息,参见Python 的 打包和分发项目的教程。

使用你自己的包

pollsdjango-polls
django-pollsvirtualenv
pip install --user django-polls/dist/django-polls-0.1.tar.gz
  1. 幸运的话,你的Django 项目现在应该又能正常工作了。 请重新运行服务器以证实这点。

  2. 若要卸载这个包,使用pip:

pip uninstall django-polls

发布您的应用程序

django-polls

使用 virtualenv 安装Python包

前面,我们将poll 安装成一个用户的库。 它有一些缺点:

  • 修改这个用户的库可能影响你的系统上的其它Python 软件。
  • 你将不可以运行这个包的多个版本(或者具有相同名字的其它包)。

特别是一旦你维护几个Django项目,这些情况就会出现。 如果确实出现,最好的解决办法是使用virtualenv。 这个工具允许你维护多个分离的Python环境,每个都具有它自己的库和包的命名空间。