Django教程之九-----高级教程:如何编写复用的应用

来源:互联网 发布:天盾数据恢复 编辑:程序博客网 时间:2024/06/05 14:56

这个教程紧接(7),我们将我们的网页问卷调查变成一个单独的python包,你可以在新项目中重用它,也可以和其他人分享。


如果你没有完成教程1-7,我们鼓励你来复习这些所以你的例子项目符合下面的描述。


1. 可重用性很重要

设计,建立,测试和维护一个web应用有很多工作要做。许多Python和Django项目都有同样的问题。如果我们可以省下这些重复的工作量难道不是很美好么?


可重用性就像是Python中的生命一种方式。<Python包索引(PyPI)>有一个广阔的包的范围,你可以在你的项目中使用这些。查阅<Django 包>了解你可以在你项目中继承的现存的可重用应用。Django本身就是一个Python包。这意味着你能将现存的Python包或者Django应用作为你自己网页项目的组成部分。你只需要编写是你项目独一无二的部分。


假设你正在开始一个新的项目,它需要一个像我们之前工作的polls应用一样的应用。你如何将这个应用重用?幸运的是,你已经在路上了。在教程(3)中,我们了解了我们可以使用include将polls从项目级的URLconf中解耦。在这个教程中,我们做更深入的几步来让应用更容易使用在新项目中,并且准备好发布给其他人安装和使用。

包?应用?

一个Python包提供了为了更容易重用的相关Python代码的组成的一种方式。一个包包含一个或者多个Python代码文件(同样也成为模块).

一个包能被使用import foo.bar或者from foo import bar导入。用于组成一个包的路径(像Polls),它必须包含一个特殊的文件__init__.py,即使这个文件是空的。

一个Django应用只是一个Python包,这个包专门用于Django的项目。一个应用可能使用通用的Django约束,例如,模块,测试,urls和views子模块。

稍后我们将使用术语”打包“来描述一个容易为其他人安装的Python包的制作过程。它可能会有一点迷惑,我们知道。


2. 你的项目和你的可重用应用

经过先前的教程之后,我们的项目应该是这个样子:

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

在教程(7)中你创建了mysite/templates,教程(3)中创建了polls/templates.也许现在很清晰为什么我们为项目和应用选择分开模板路径:所有东西都是在polls中的polls应用的一部分。它让应用自包含并且更容易变成一个新的项目。


polls目录现在可以备份成一个新的Django项目并且可以立即使用。尽管它还没有准备好发布。要完成那个,我们需要打包应用好让其他人更容易安装。


3. 安装一些先决条件

当前pyhon打包的状态是有着各种工具的一团糟。对于这个教程,我们将使用setuptools来建立我们的包。他是推荐的打包工具(与分发合并)。我们同样使用pip来安装和卸载。你应该安装这2个包。如果你需要帮助,你可以参考<如何使用pip安装Django>。你可以以同样的方式安装setuptools。


4. 打包你的应用

Python打包指的是以一种特殊的格式准备你的应用,以让它更容易安装和使用。Django本身就是一个这样的包。对于想polls这样的小型应用来说,这个过程不会太难。

  1. 首先,为polls创建爱你一个父路径,在你的Django项目的外面。将这个路径起名为django-polls                        为你的应用选择一个名字                                                                                                                                                               当为你的包选择名字时,检查类似PyPI的源来避免和现有的包名称冲突。当创建一个发布的包时预先将django-加到你的名称中将会很有帮助。这将帮助其他寻找Django应用的人将你的应用作为指定的Django识别。                                                          应用标签(那是,应用包的点路径的最后一部分)必须在INSTALLED_APPS中是独一无二的。避免使用和Django的任何contrib包相同的标签,例如auth,admin或者messages.
  2. 将polls路径移动到django-polls路径
  3. 创建一个文件django-polls/README.rst使用下列代码:
    django-polls/README.rst=====Polls=====Polls is a simple Django app to conduct Web-based polls. For eachquestion, 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::    url(r'^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.

  4. 创建一个django-polls/LICENSE文件。选择一个许可证对于这个教程来说超出了范围,但足以说明没有许可证的公开代码发布是没有用的。Django和许多Django兼容应用是在BSD许可证下发布的;然而,你可以自由选择你的许可证。请注意,你的许可证的选择将会影响到使用你代码的人。
  5. 下一步我们将创建一个setup.py文件,它提供了关于如何去建立和安装应用的明细。这个文档的完整解释超出了这个教程的范围,但是<安装工具文档>有一个好的解释。创建一个文件django-polls/setup.py,并写入以下代码:
    django-polls/setup.pyimport osfrom setuptools import find_packages, setupwith open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme:    README = readme.read()# allow setup.py to be run from any pathos.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',        # Replace these appropriately if you are stuck on Python 2.        'Programming Language :: Python :: 3',        'Programming Language :: Python :: 3.4',        'Programming Language :: Python :: 3.5',        'Topic :: Internet :: WWW/HTTP',        'Topic :: Internet :: WWW/HTTP :: Dynamic Content',    ],)

  6. 只有Python模块和包默认是包含在包里的。为了包含额外的文件,我们需要创建一个MANIFEST.in文件。<安装工具文档>有更多这个文件的细节。为了包含模板,README.rst和我们的LICENSE文件,创建一个有以下内容的文件django-polls/MANIFEST.in:
    django-polls/MANIFEST.ininclude LICENSEinclude README.rstrecursive-include polls/static *recursive-include polls/templates *

  7. 它是可选的,但是是推荐的,在你的应用中包含详细的文档。创建一个空的路径django-polls/docs,留给未来的文档。在django-polls/MANIFEST.in里添加额外的一行:
    recursive-include docs *
    注意,docs路径将不会包含在你的包里除非你在它里面添加了一些文件。许多Django应用同样提供他们的在线文档通过站点readthedocs.org.
  8. 尝试使用python setup.py sdist(在django-polls内部执行)来建立你的包。这创建一个路径成为dist并且建立了你的新包,django-polls-0.1.tar.gz.

了解打包的更多详情,请阅读Python的<打包和发布项目教程>


5. 使用你自己的包

因为我们将polls路径移出了项目,它不再起作用。我们现在通过安装我们新的django-polls包来修复这个问题。

作为用户库安装

下列步骤将django-polls作为一个用户库来安装。基于用户的安装比在系统范围安装包有很大的优势,例如在一个你没有管理员权限的系统上使用,防止包影响系统服务和其他用户的机器。

注意,基于用户的安装仍然能影响作为那个用户运行的统工具的行为,所以virtualenv是更优秀的解决方案(看下面)


  1. 为了安装包,使用pip(你已经安装过了,对吗?):
    pip install --user django-polls/dist/django-polls-0.1.tar.gz

  2. 幸运的话,你的Django项目想在应该能再次正确运行了。运行服务来确认这一点
  3. 卸载包,使用pip:
    pip uninstall django-polls


6. 发布你的应用

现在我们已经打包并测试了django-polls,准备好与世界分享了!如果这不是一个例子,你可以:
  • 将包邮件给你的朋友
  • 上传包到你的网站
  • 发布到公用仓库,例如 Python包索引(PyPI).packaging.python.org有一个做这个的好的教程。

7. 使用virtualenv安装Python包

之前,我们将polls应用作为用户库安装,这有几个缺点:
  • 修改用户库将会影响你系统上的其他Python软件
  • 你不能运行这个包的多个版本(或者其他有相同名字的东西)。
典型的,这个情况只有在你正在维护多个Django项目是才会出现。当它们出现是,最好的解决方案就是使用virualenv。这个工具允许你去维护多个隔离的Python环境,每一个都有它自己的包命名空间和库的备份。





阅读全文
0 0