高级教程:如何编写可重用的app (page 13)

本节教程上接第七部分(Page 12)。我们会把我们的 web-poll应用转换成一个独立的python包,你可以在新的项目中重用或者把它分享给其他人。

如果你没有学习完1-7部分的教程,我们建议你回顾这些教程,以便你的实例项目匹配下面的描述。

可重用性问题

设计、构建、测试和维护一个web应用需要做很多工作。许多python和django项目都有共同的问题。如果我们保存一些重复性的工作,不是会更好么?

可重用性是python中的一种常见方式。 The Python Package Index (PyPI)中有大量可以在你自己的python程序中使用的包。 Django Packages 中已有的可重用的app你都可以结合到你的项目中。Django自己也是一个python包。也就是说,你可以使用一个已有的python包或者django app,把他们融合到你自己的web项目中。你只需要编写你项目中独有的部分。

假设你已经启动了一个需要使用一个类似我们前面编写的polls app的新项目。你要如何重用这个app呢?幸运的是,你已经拥有正确的方法了。在第三部分(page 8)中,我们看到了我们是如何使用include从项目级的URLconf中解耦出polls应用。在本节教程中,我们会进一步是app易于在新项目中使用,并为他们安装和使用做准备。

Package? App? 包? 应用?

python package提供一种把有相关性的代码分成一组以易于重用的方式。一个package包含一个或多个python代码文件(也成为“模块”)。

包可以通过import foo.barfrom foo import bar的方式被导入。一个目录要形成一个包,它必须包含一个特殊的init.py文件,即使这个文件是空的。

一个django应用就是一个专门供django项目使用的python package。一个应用可以使用通用的django约定,例如包含models, tests, urls, 和 views子模块。

稍后,我们使用打包这个术语去描述让python package易于其他人安装的过程。这可能会有点让人迷惑。

你的项目和你的可重用app

经过学习前面的教程,我们的项目看起来会像下面一样:

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

你在第七部分(page 12)中创建了mysite/templates,在第三部分(page 8)中创建了polls/templates。现在你可能清楚了为什么我们要给项目和应用选择单独的模板目录:polls应用中的部分都在 polls中,这使应用自成一体并更容易放入新项目中。polls目录现在可以被复制到一个新的django项目中,并立刻重用。尽管还没做好发布它的准备。为此,我们需要打包这个app,让它方便其他人安装。

安装一些先决条件(prerequisites)

因为使用多种工具,现在的打包状态有一点混乱。对本节教程来说,我们会使用setuptools工具去构建我们的包。它是一个推荐的打包工具(已经和distribute分支合并)。我们还会使用pip去安装和卸载它。现在你应该安装这两个包。如果你需要帮助,你可以参考how to install Django with pip.你可以使用相同的方式来安装setuptools

打包你的app

python打包是指以特定的格式编写应用程序,这种格式可以很容易被安装和使用。Django就是类似这样方式被打包的。对于像polls这样的小应用,处理过程不会太困难。

  1. 首先,在你的django项目之外,为polls创建一个父目录。这个目录是django-polls

为你的app选择一个名字

当为你的app选择名字时,检查类似PyPI的源,避免和已存在的包有命名冲突。当创建一个包的来分发时,将django-作为模块名的开头通常会很有用。这会帮助其他人寻找django app时,分辨出你的app是专门用于django的

应用标签(也就是应用程序包的点分路径的最后一部分)在INSTALLED_APPS(少一个链接)中必须是唯一的,避免和任何django contrib packages少一个链接)使用相同的标签,例如auth, admin, 或 messages

  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.
  3. 创建一个django-polls/LICENSE文件,选择许可证超出了本教程的范围,但值得一提的是,未经许可发布的代码是无用的。django和许多兼容django的app都以BSD许可证发布。不管怎么说,你可以自由选择你的许可证。需要注意你选择的许可证会影响到谁可以使用你的代码。

  4. 下一步,我们会创建一个setup.py文件,它可以提供关于如何构建和安装app的细节,关于这个文件的完整解释超出了本教程的范围,但setup.py有一个很好的解释。使用下面的内容创建一个django-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',
    ],
    )
  5. 默认情况下只有python模块和包会被包含在包中。要包含额外的文件,我们需要创建一个MANIFEST.in文件。前面提到的setuptools文档中有这个文件的更过信息。要包含模板README.rstLICENSE文件,使用下面的内容创建一个django-polls/MANIFEST.in文件:

    django-polls/MANIFEST.in
    include LICENSE
    include README.rst
    recursive-include polls/static *
    recursive-include polls/templates *
  6. 在app中包含详细的文档是可选的,但建议你这么做。创建一个django-polls/docs空目录,用于以后保存文档。在django-polls/MANIFEST.in中添加额外的一行:

    recursive-include docs *

    注意docs目录不会被打包进你的包,除非你在它下面添加一些文件。许多Django app都会通过类似readthedocs.org这样的站点提供他们的文档。

  7. 尝试使用 python setup.py sdist 构建你的包(在django-polls运行)。这样会创建一个名字是dist的目录,并构建一个新的包:django-polls-0.1.tar.gz

更多关于打包的信息,请看Tutorial on Packaging and Distributing Projects

使用你自己的package(包)

从我们将polls目录从项目中移出后,它就不再工作了。现在我们通过安装django-polls包来修复这个问题。

安装成用户库

下面步骤是把django-polls安装成用户的库。用户级安装相比系统级安装有很多优势,例如在没有管理员权限的系统上使用,以及防止包影响机器上的系统服务和其他用户。

注意用户级安装仍可以影响以该用户运行的系统工具,所以virtualenv是一个更可靠的方案。

  1. 使用pip安装这个包(你已经把pip安装好了,对不对?参考本页上面安装先决条件的部分)

    pip install --user django-polls/dist/django-polls-0.1.tar.gz
  2. 幸运的话,你的django项目现在应该再次正常工作了。运行服务器来确认。

  3. 使用pip卸载这个包:

    pip uninstall django-polls

发布你的app

现在我们已经打包并测试了django-polls,它已经准备好分享给世界了。如果它不仅仅是一个例子,现在你可以:

使用virtualenv安装python包

前面,我们把polls app安装成了一个用户库。这样做有一些缺点:

  • 修改用户库可能会影响你系统中的其他python软件。
  • 你将不能运行该包的多个版本(或者具有相同名称的其他版本)

通常,一旦你维护多个django项目时,这种情况就会出现。当出现这种情况,最好的解决方案就是使用 virtualenv。这个工具允许你运行多个隔离的python环境,每个环境都有它自己的库和包的命名空间。

Django 2.0.1 官方文档翻译: 高级教程:如何编写可重用的app (page 13)的更多相关文章

  1. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第一部分(Page 6)

    编写你的第一个 Django app,第一部分(Page 6)转载请注明链接地址 Django 2.0.1 官方文档翻译: Django 2.0.1.dev20171223092829 documen ...

  2. Django 2.0.1 官方文档翻译: 快速安装向导 (Page5)

    快速安装向导 (Page 5) 在你使用 Django 前,你需要先安装它.我们有一个完整的安装向导,它包含所有涉及的内容,这个向导会指导你进行一个简单的.最小化的安装,当你通过浏览介绍内容的时候,这 ...

  3. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第七部分(Page 12)

    编写你的第一个 Django app,第七部分(Page 12)转载请注明链接地址 本节教程承接第六部分(page 11)的教程.我们继续开发 web-poll应用,并专注于自定义django的自动生 ...

  4. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第三部分(Page 8)

    编写你的第一个 Django app,第三部分(Page 8)转载请注明链接地址 本页教程接前面的第二部分.我们继续开发 web-poll app,我们会专注于创建公共接口上 -- "视图& ...

  5. Django 2.0.1 官方文档翻译:编写你的第一个djang补丁(page 15)

    编写你的第一个djang补丁(page 15) 介绍 有兴趣为社区做一些贡献?可能你发现了django中的一个你想修复的bug,或者你你想添加一个小小的功能. 回馈django就是解决你遇到的问题的最 ...

  6. Django 2.0.1 官方文档翻译: 如何安装 django (Page 17)

    如何安装 django(Page 17) 这一部分可以让你将 Django 运行起来. 安装 Python 作为 python 的一个 web 框架,Django 依赖 Python.Python 的 ...

  7. Django 2.0.1 官方文档翻译:接下来读什么(page 14)

    接下来读什么(page 14) 现在你应该已经阅读了所有的(page1-13 )介绍材料,决定继续使用Django.我们仅仅做了简要的介绍(事实上,如果你阅读了前面所有的内容,也只是全部文档的5%.) ...

  8. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第五部分(Page 10)

    编写你的第一个 Django app,第五部分(Page 10)转载请注明链接地址 我们继续建设我们的 Web-poll 应用,本节我们会为它创建一些自动测试. 介绍自动测试 什么是自动测试 测试是简 ...

  9. Django 2.0.1 官方文档翻译: 编写你的第一个 Django app,第二部分(Page 7)

    编写你的第一个 Django app,第二部分(Page 7)转载请注明链接地址 本教程上接前面的教程.我们会配置数据,创建你的第一个 model,并对Django 自动生成的 admin 站点进行快 ...

随机推荐

  1. 结对随即四则运算(带界面Java版)

    //随机四则运算类 public class 随机四则运算 { public static void main(String[] args) { new 界面();//进入随机四则运算的首界面 } } ...

  2. 项目冲刺Beta第三篇博客

    Beta版本冲刺计划安排 1.当天站立式会议照片: 2.工作分工: 团队成员 分工 张洪滨060  排行榜界面美化 陈敬轩059  注册成功界面美化 黄兴067  登录界面美化 林国梽068  答题界 ...

  3. JavaBean 与 EJB 的区别

    JavaBean在一般情况下指的是实体类,在大部分情况下和POJO是同义词,基本构成就是一些字段和与之对应的 setter.getter方法,如果一个JavaBean需要在不同的JVM的进程中进行传递 ...

  4. TCP系列52—拥塞控制—15、前向重传与RACK重传拥塞控制处理对比

    一.概述 这里主要简单分析一个丢包重传并恢复的场景,通过不同的设置让这个相同的场景分别触发RACK重传和前向重传,通过对比说明以下问题: Forward Retransmit可以产生只有重传标记的数据 ...

  5. Java-JDBC.mysql 工具类 读取本地文件配置

    引用 mysql-connector-jav 的jar 配置文件为  database.propertties .  格式如下 driverClass=com.mysql.jdbc.Driver ur ...

  6. Code Blocks中配置OpenGL

    使用的文件:我的CSDN资源共享 将glut.h文件放到MinGw\include\GL目录下面 将glut32.dll文件放到C:\windows\system32目录下面(如果是64位操作系统的话 ...

  7. Eclipse中设置作者、日期等的方式

    1.点击Windows->Preferences->Java->Code Style->Code Templates: 2.点击展开右侧的Comments选项卡,里面的选项对应 ...

  8. 虚拟机VMware的安装

    什么是虚拟软件: 虚拟软件是一个可以使你在一台机器上同时运行二个或更多Windows.LINUX等系统.它可以模拟一个标准PC环境.这个环境和真实的计算机一样,都有芯片组.CPU.内存.显卡.声卡.网 ...

  9. [BZOJ4446]SCoi2015 小凸玩密室 树形DP(烧脑高能预警)

    4446: [Scoi2015]小凸玩密室 Time Limit: 10 Sec  Memory Limit: 128 MB Description 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点 ...

  10. Jackson 使用

    // 序列化出来的 JSON, 不包含值为 NULL 类型字段. mapper.setSerializationInclusion(Include.NON_NULL); Jackson provide ...