“Django/docs/3.0.x/intro/reusable-apps”的版本间差异

来自菜鸟教程
Django/docs/3.0.x/intro/reusable-apps
跳转至:导航、​搜索
(autoload)
 
(Page commit)
 
第1行: 第1行:
 +
{{DISPLAYTITLE:进阶教程:如何编写可重用的应用程序 — Django 文档}}
 
<div id="advanced-tutorial-how-to-write-reusable-apps" class="section">
 
<div id="advanced-tutorial-how-to-write-reusable-apps" class="section">
  
= 进阶指南:如何编写可重用程序 =
+
= 进阶教程:如何编写可重用的应用程序 =
  
这篇进阶指南从 [[../tutorial07|<span class="doc">Tutorial 7</span>]] 结尾的地方继续讲起。我们将会把我们的 Web-poll 放进一个独立的 Python 包中,以便你在新的项目中重用它或将它与他人分享。
+
本高级教程从 [[../tutorial07|教程 7]] 停止的地方开始。 我们将把我们的网络投票变成一个独立的 Python 包,您可以在新项目中重用并与其他人共享。
  
如果你尚未完成教程 1-7,我们推荐你先浏览一遍教程,这样你的样例工程会和下面的一致。
+
如果您最近还没有完成教程 1-7,我们鼓励您查看这些内容,以便您的示例项目与下面描述的项目相匹配。
  
 
<div id="reusability-matters" class="section">
 
<div id="reusability-matters" class="section">
第11行: 第12行:
 
== 可重用性很重要 ==
 
== 可重用性很重要 ==
  
设计,构建,测试以及维护一个 web 应用要做很多的工作。很多 Python 以及 Django 项目都有一些常见问题。如果我们能保存并利用这些重复的工作岂不是更好?
+
设计、构建、测试和维护 Web 应用程序需要大量工作。 许多 Python Django 项目都有共同的问题。 如果我们可以保存一些重复的工作,那不是很好吗?
  
可重用性是 Python 的根本。[https://pypi.python.org/pypi The Python Package Index (PyPI)] 有许大量的包,都可被用在你自己的 Python 项目中。同样可以在 [https://djangopackages.org Django Packages] 中查找已发布的可重用应用,也可将其引入到你的项目中。Django 本身也是一个 Python 包,也就是说你可以将已有的 Python 包或 Django 应用并入你的项目。你只需要编写属于你的那部分即可。
+
可重用性是 Python 的生活方式。 [https://pypi.org/ Python 包索引 (PyPI)] 有大量的包,你可以在你自己的 Python 程序中使用。 查看 [https://djangopackages.org Django Packages],了解您可以在项目中合并的现有可重用应用程序。 Django 本身也是一个普通的 Python 包。 这意味着您可以使用现有的 Python 包或 Django 应用程序并将它们组合到您自己的 Web 项目中。 您只需要编写使您的项目独一无二的部分。
  
假设你现在创建了一个新的项目,并且需要一个类似我们之前做的投票应用。你该如何复用这个应用呢?庆幸的是,其实你已经知道了一些。在 [[../tutorial01|<span class="doc">教程 1</span>]],我们使用过 <code>include</code> 从项目级别的 URLconf 分割出 polls。在本教程中,我们将进一步使这个应用易用于新的项目中,并发布给其他人安装使用。
+
假设您要开始一个新项目,需要像我们一直在开发的那种民意调查应用程序。 你如何使这个应用程序可重用? 幸运的是,你已经在路上了。 在 [[../tutorial01|教程 1]] 中,我们看到了如何使用 <code>include</code> 将投票与项目级 URLconf 分离。 在本教程中,我们将采取进一步措施,使该应用程序易于在新项目中使用,并准备好发布供其他人安装和使用。
  
 
<div class="admonition-package-app admonition">
 
<div class="admonition-package-app admonition">
  
包?应用?
+
包裹? 应用程序?
  
一个 <span class="xref std std-term">package</span> 提供了一组关联的 Python 代码的简单复用方式。一个包(“模块”)包含了一个或多个 Python 代码文件。
+
Python <span class="xref std std-term">package</span> 提供了一种对相关 Python 代码进行分组以便于重用的方法。 一个包包含一个或多个 Python 代码文件(也称为“模块”)。
  
一个包通过 <code>import foo.bar</code> 或 <code>from foo import bar</code> 的形式导入。一个目录(例如 <code>polls</code>)要成为一个包,它必须包含一个特定的文件 <code>__init__.py</code>,即便这个文件是空的。
+
可以使用 <code>import foo.bar</code> 或 <code>from foo import bar</code> 导入包。 一个目录(如<code>polls</code>)要形成一个包,它必须包含一个特殊的文件<code>__init__.py</code>,即使这个文件是空的。
  
Django ''应用'' 仅仅是专用于 Django 项目的 Python 包。应用会按照 Django 规则,创建好 <code>models</code>, <code>tests</code>, <code>urls</code>, 以及 <code>views</code> 等子模块。
+
Django ''application'' 是一个 Python 包,专门用于 Django 项目。 应用程序可能使用常见的 Django 约定,例如具有 <code>models</code><code>tests</code><code>urls</code> <code>views</code> 子模块。
  
稍后,我们将解释术语 ''打包'' ——为了方便其它人安装 Python 包的处理流程。我知道,这可能会使你感到一点点迷惑。
+
稍后我们使用术语 ''packaging'' 来描述使 Python 包易于其他人安装的过程。 这可能有点令人困惑,我们知道。
  
  
第35行: 第36行:
 
<div id="your-project-and-your-reusable-app" class="section">
 
<div id="your-project-and-your-reusable-app" class="section">
  
== 你的项目和可复用应用 ==
+
== 您的项目和可重用的应用程序 ==
  
通过前面的教程,我们的工程应该看起来像这样:
+
在前面的教程之后,我们的项目应该是这样的:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第43行: 第44行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>mysite/
+
<syntaxhighlight lang="python">mysite/
 
     manage.py
 
     manage.py
 
     mysite/
 
     mysite/
第74行: 第75行:
 
     templates/
 
     templates/
 
         admin/
 
         admin/
             base_site.html</pre>
+
             base_site.html</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
1
+
您在 [[../tutorial07|教程 7]] 中创建了 <code>mysite/templates</code>,在 [[../tutorial03|教程 3]] 中创建了 <code>polls/templates</code>。 现在也许更清楚为什么我们选择为项目和应用程序使用单独的模板目录:民意调查应用程序的所有内容都在 <code>polls</code> 中。 它使应用程序自包含并且更容易放入新项目中。
  
目录 <code>polls</code> 现在可以被拷贝至一个新的 Django 工程,且立刻被复用。不过现在还不是发布它的时候。为了这样做,我们需要打包这个应用,便于其他人安装它。
+
<code>polls</code> 目录现在可以复制到新的 Django 项目中并立即重用。 不过还没有完全准备好发布。 为此,我们需要打包应用程序以方便其他人安装。
  
  
第88行: 第89行:
  
 
<span id="installing-reusable-apps-prerequisites"></span>
 
<span id="installing-reusable-apps-prerequisites"></span>
== 安装必须环境 ==
+
== 安装一些先决条件 ==
  
目前,打包 Python 程序需要工具,有许多工具可以完成此项工作。在此教程中,我们将使用 [https://pypi.org/project/setuptools/ setuptools] 来打包我们的程序。这是推荐的打包工具(与 <code>发布</code> 分支合并)。我们仍旧使用 [https://pypi.org/project/pip/ pip] 来安装和卸载这个工具。现在,你需要安装这两个包。如果你需要帮助,你可以参考 [[../../topics/install#installing-official-release|<span class="std std-ref">如何通过 pip 安装 Django</span>]],你可以通过相同的方式安装 <code>setuptools</code>。
+
Python 打包的当前状态与各种工具有点混乱。 在本教程中,我们将使用 [https://pypi.org/project/setuptools/ setuptools] 来构建我们的包。 它是推荐的打包工具(与 <code>distribute</code> fork 合并)。 我们还将使用 [https://pypi.org/project/pip/ pip] 来安装和卸载它。 您现在应该安装这两个软件包。 如果需要帮助,可以参考[[../../topics/install#installing-official-release|如何使用pip]]安装Django。 你可以用同样的方法安装<code>setuptools</code>。
  
  
第96行: 第97行:
 
<div id="packaging-your-app" class="section">
 
<div id="packaging-your-app" class="section">
  
== 打包你的应用 ==
+
== 打包您的应用程序 ==
  
Python ''打包'' 将以一种特殊的格式组织你的应用,意在方便安装和使用这个应用。Django 本身就被打包成类似的形式。对于一个小应用,例如 polls,这不会太难。
+
Python ''packaging'' 是指以易于安装和使用的特定格式准备您的应用程序。 Django 本身就是这样打包的。 对于像民意调查这样的小应用程序,这个过程并不太难。
  
 
<ol>
 
<ol>
<li><p>首先,在你的 Django 项目目录外创建一个名为 <code>django-polls</code> 的文件夹,用于盛放 <code>polls</code>。</p>
+
<li><p>首先,在 Django 项目之外为 <code>polls</code> 创建一个父目录。 调用这个目录<code>django-polls</code>。</p>
 
<div class="admonition-choosing-a-name-for-your-app admonition">
 
<div class="admonition-choosing-a-name-for-your-app admonition">
  
<p>为你的应用选择一个名字</p>
+
<p>为您的应用选择名称</p>
<p>当为你的包选一个名字时,避免使用像 PyPI 这样已存在的包名,否则会导致冲突。当你创建你的发布包时,可以在模块名前增加 <code>django-</code> 前缀,这是一个很常用也很有用的避免包名冲突的方法。同时也有助于他人在寻找 Django 应用时确认你的 app 是 Django 独有的。</p>
+
<p>为包选择名称时,请检查 PyPI 等资源以避免与现有包发生命名冲突。 在创建要分发的包时,在模块名称前加上 <code>django-</code> 通常很有用。 这有助于其他寻找 Django 应用程序的人将您的应用程序识别为特定于 Django 的应用程序。</p>
<p>应用标签(指用点分隔的包名的最后一部分)在 [[../../ref/settings#std-setting-INSTALLED_APPS|<code>INSTALLED_APPS</code>]] 中 ''必须'' 是独一无二的。避免使用任何与 Django [[../../ref/contrib/index|<span class="doc">contrib packages</span>]] 文档中相同的标签名,比如 <code>auth</code><code>admin</code><code>messages</code>。</p>
+
<p>应用程序标签(即应用程序包的虚线路径的最后一部分)''必须'' 在 [[#id1|:setting:`INSTALLED_APPS`]] 中是唯一的。 避免使用与任何 Django [[../../ref/contrib/index|contrib ]] 相同的标签,例如 <code>auth</code><code>admin</code> <code>messages</code>。</p>
  
 
</div></li>
 
</div></li>
<li><p>将 <code>polls</code> 目录移入 <code>django-polls</code> 目录。</p></li>
+
<li><p>将<code>polls</code>目录移动到<code>django-polls</code>目录下。</p></li>
<li><p>创建一个名为 <code>django-polls/README.rst</code> 的文件,包含以下内容:</p>
+
<li><p>创建一个文件 <code>django-polls/README.rst</code>,内容如下:</p>
<div id="id1" class="literal-block-wrapper docutils container">
+
<div id="id3" class="literal-block-wrapper docutils container">
  
 
<div class="code-block-caption">
 
<div class="code-block-caption">
第122行: 第123行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>=====
+
<syntaxhighlight lang="rst">=====
 
Polls
 
Polls
 
=====
 
=====
第129行: 第130行:
 
visitors can choose between a fixed number of answers.
 
visitors can choose between a fixed number of answers.
  
Detailed documentation is in the &quot;docs&quot; directory.
+
Detailed documentation is in the "docs" directory.
  
 
Quick start
 
Quick start
 
-----------
 
-----------
  
1. Add &quot;polls&quot; to your INSTALLED_APPS setting like this::
+
1. Add "polls" to your INSTALLED_APPS setting like this::
  
 
     INSTALLED_APPS = [
 
     INSTALLED_APPS = [
第150行: 第151行:
 
   to create a poll (you'll need the Admin app enabled).
 
   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.</pre>
+
5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.</syntaxhighlight>
  
 
</div>
 
</div>
第157行: 第158行:
  
 
</div></li>
 
</div></li>
<li><p>创建一个 <code>django-polls/LICENSE</code> 文件。选择一个非本教程使用的授权协议,但是要足以说明发布代码没有授权证书是 ''不可能的'' 。Django 和很多兼容 Django 的应用是以 BSD 授权协议发布的;不过,你可以自己选择一个授权协议。只要确定你选择的协议能够限制未来会使用你的代码的人。</p></li>
+
<li><p>创建一个 <code>django-polls/LICENSE</code> 文件。 选择许可证超出了本教程的范围,但可以说未经许可证公开发布的代码是 ''无用'' Django 和许多与 Django 兼容的应用程序是在 BSD 许可下分发的; 但是,您可以自由选择自己的许可证。 请注意,您的许可选择将影响谁可以使用您的代码。</p></li>
<li><p>下一步我们将创建 <code>setup.cfg````setup.py</code> 文件用于说明如何构建和安装应用的细节。关于此文件的完整介绍超出了此教程的范围,但是 [https://setuptools.readthedocs.io/en/latest/ setuptools docs] 有详细的介绍。创建文件 <code>django-polls/setup.py</code> 包含以下内容:</p>
+
<li><p>接下来,我们将创建 <code>setup.cfg</code> <code>setup.py</code> 文件,详细说明如何构建和安装应用程序。 对这些文件的完整解释超出了本教程的范围,但 [https://setuptools.readthedocs.io/en/latest/ setuptools 文档] 有很好的解释。 使用以下内容创建文件 <code>django-polls/setup.cfg</code> 和 <code>django-polls/setup.py</code></p>
<div id="id2" class="literal-block-wrapper docutils container">
+
<div id="id4" class="literal-block-wrapper docutils container">
  
 
<div class="code-block-caption">
 
<div class="code-block-caption">
第170行: 第171行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>[metadata]
+
<syntaxhighlight lang="ini">[metadata]
 
name = django-polls
 
name = django-polls
 
version = 0.1
 
version = 0.1
第182行: 第183行:
 
     Environment :: Web Environment
 
     Environment :: Web Environment
 
     Framework :: Django
 
     Framework :: Django
     Framework :: Django :: X.Y  # Replace &quot;X.Y&quot; as appropriate
+
     Framework :: Django :: X.Y  # Replace "X.Y" as appropriate
 
     Intended Audience :: Developers
 
     Intended Audience :: Developers
 
     License :: OSI Approved :: BSD License
 
     License :: OSI Approved :: BSD License
第197行: 第198行:
 
[options]
 
[options]
 
include_package_data = true
 
include_package_data = true
packages = find:</pre>
+
packages = find:</syntaxhighlight>
  
 
</div>
 
</div>
第204行: 第205行:
  
 
</div>
 
</div>
<div id="id3" class="literal-block-wrapper docutils container">
+
<div id="id5" class="literal-block-wrapper docutils container">
  
 
<div class="code-block-caption">
 
<div class="code-block-caption">
第215行: 第216行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>from setuptools import setup
+
<syntaxhighlight lang="python">from setuptools import setup
  
setup()</pre>
+
setup()</syntaxhighlight>
  
 
</div>
 
</div>
第224行: 第225行:
  
 
</div></li>
 
</div></li>
<li><p>默认包中只包含 Python 模块和包。为了包含额外文件,我们需要创建一个名为 <code>MANIFEST.in</code> 的文件。上一步中关于 setuptools 的文档详细介绍了这个文件。为了包含模板、<code>README.rst</code> 和我们的 <code>LICENSE</code> 文件,创建文件 <code>django-polls/MANIFEST.in</code> 包含以下内容:</p>
+
<li><p>默认情况下,包中仅包含 Python 模块和包。 要包含其他文件,我们需要创建一个 <code>MANIFEST.in</code> 文件。 上一步中提到的 setuptools 文档更详细地讨论了这个文件。 要包含模板、<code>README.rst</code> 和我们的 <code>LICENSE</code> 文件,请创建一个包含以下内容的文件 <code>django-polls/MANIFEST.in</code></p>
<div id="id4" class="literal-block-wrapper docutils container">
+
<div id="id6" class="literal-block-wrapper docutils container">
  
 
<div class="code-block-caption">
 
<div class="code-block-caption">
第236行: 第237行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>include LICENSE
+
<syntaxhighlight lang="text">include LICENSE
 
include README.rst
 
include README.rst
 
recursive-include polls/static *
 
recursive-include polls/static *
recursive-include polls/templates *</pre>
+
recursive-include polls/templates *</syntaxhighlight>
  
 
</div>
 
</div>
第246行: 第247行:
  
 
</div></li>
 
</div></li>
<li><p>在应用中包含详细文档是可选的,但我们推荐你这样做。创建一个空目录 <code>django-polls/docs</code> 用于未来编写文档。额外添加一行至 <code>django-polls/MANIFEST.in</code></p>
+
<li><p>在您的应用程序中包含详细的文档是可选的,但建议您这样做。 为将来的文档创建一个空目录 <code>django-polls/docs</code>。 向 <code>django-polls/MANIFEST.in</code> 添加一行:</p>
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
  
 
<div class="highlight">
 
<div class="highlight">
  
<pre>recursive-include docs *</pre>
+
<syntaxhighlight lang="python">recursive-include docs *</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
<p>注意,现在 <code>docs</code> 目录不会被加入你的应用包,除非你往这个目录加几个文件。许多 Django 应用也提供他们的在线文档通过类似 [https://readthedocs.org readthedocs.org] 这样的网站。</p></li>
+
<p>请注意,除非您向其中添加一些文件,否则 <code>docs</code> 目录不会包含在您的包中。 许多 Django 应用程序还通过 [https://readthedocs.org readthedocs.org] 等网站在线提供其文档。</p></li>
<li><p>试着构建你自己的应用包通过 <code>ptyhon setup.py sdist</code> (在 <code>django-polls``目录内)。这将创建一个名为 ``dist</code> 的目录并构建你自己的应用包, <code>django-polls-0.1.tar.gz</code>。</p></li></ol>
+
<li><p>尝试使用 <code>python setup.py sdist</code> 构建您的包(从 <code>django-polls</code> 内部运行)。 这将创建一个名为 <code>dist</code> 的目录并构建您的新包 <code>django-polls-0.1.tar.gz</code>。</p></li></ol>
  
更多关于打包的信息,见 Python 的 [https://packaging.python.org/tutorials/packaging-projects/ 关于打包和发布项目的教程]。
+
有关打包的更多信息,请参阅 Python 的 [https://packaging.python.org/tutorials/packaging-projects/ 打包和分发项目教程] 。
  
  
第265行: 第266行:
 
<div id="using-your-own-package" class="section">
 
<div id="using-your-own-package" class="section">
  
== 使用你自己的包名 ==
+
== 使用你自己的包 ==
  
由于我们把 <code>polls</code> 目录移出了项目,所以它无法工作了。我们现在要通过安装我们的新 <code>django-polls</code> 应用来修复这个问题。
+
由于我们将 <code>polls</code> 目录移出项目,它不再起作用。 我们现在将通过安装我们新的 <code>django-polls</code> 包来解决这个问题。
  
 
<div class="admonition-installing-as-a-user-library admonition">
 
<div class="admonition-installing-as-a-user-library admonition">
  
作为用户库安装
+
安装为用户库
  
以下步骤将 <code>django-polls</code> 以用户库的形式安装。与安装整个系统的软件包相比,用户安装具有许多优点,例如可在没有管理员访问权的系统上使用,以及防止应用包影响系统服务和其他用户。
+
以下步骤将 <code>django-polls</code> 安装为用户库。 与在系统范围内安装软件包相比,按用户安装有很多优点,例如可以在没有管理员访问权限的系统上使用,以及防止软件包影响系统服务和机器的其他用户。
  
Note that per-user installations can still affect the behavior of system
+
请注意,每个用户的安装仍然会影响以该用户身份运行的系统工具的行为,因此使用虚拟环境是一个更强大的解决方案(见下文)。
tools that run as that user, so using a virtual environment is a more robust
 
solution (see below).
 
  
  
 
</div>
 
</div>
 
<ol>
 
<ol>
<li><p>为了安装这个包,使用 pip (你早已 [[#installing-reusable-apps-prerequisites|<span class="std std-ref">安装 pip</span>]], 对吗?):</p>
+
<li><p>要安装该软件包,请使用 pip(您已经 [[#installing-reusable-apps-prerequisites|安装了它]] ,对吗?):</p>
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
  
 
<div class="highlight">
 
<div class="highlight">
  
<pre>python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz</pre>
+
<syntaxhighlight lang="python">python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div></li>
 
</div></li>
<li><p>幸运的话,你的 Django 项目应该再一次正确运行。启动服务器确认这一点。</p></li>
+
<li><p>幸运的是,您的 Django 项目现在应该可以正常工作了。 再次运行服务器以确认这一点。</p></li>
<li><p>通过 pip 卸载包:</p>
+
<li><p>要卸载软件包,请使用 pip:</p>
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
  
 
<div class="highlight">
 
<div class="highlight">
  
<pre>python -m pip uninstall django-polls</pre>
+
<syntaxhighlight lang="python">python -m pip uninstall django-polls</syntaxhighlight>
  
 
</div>
 
</div>
第308行: 第307行:
 
<div id="publishing-your-app" class="section">
 
<div id="publishing-your-app" class="section">
  
== 发布你的应用 ==
+
== 发布您的应用 ==
  
现在,你已经对 <code>django-polls</code> 完成了打包和测试,准备好向世界分享它!如果这不是一个例子应用,你现在就可以这样做。
+
现在我们已经打包并测试了<code>django-polls</code>,它已经准备好与世界分享了! 如果这不仅仅是一个例子,你现在可以:
  
* 通过邮件将你的包发送给朋友。
+
* 将包裹通过电子邮件发送给朋友。
* 将这个包上传至你的网站。
+
* 将包上传到您的网站。
* 将你的包发布至公共仓库,比如 [https://pypi.python.org/pypi the Python Package Index (PyPI)]。 [https://packaging.python.org packaging.python.org] 有一个不错的 [https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives 教程] 说明如何发布至公共仓库。
+
* 将包发布到公共存储库上,例如 [https://pypi.org/ Python 包索引 (PyPI)]。 [https://packaging.python.org packaging.python.org] [https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives 一个很好的教程] 来做这件事。
  
  
第320行: 第319行:
 
<div id="installing-python-packages-with-a-virtual-environment" class="section">
 
<div id="installing-python-packages-with-a-virtual-environment" class="section">
  
== Installing Python packages with a virtual environment ==
+
== 使用虚拟环境安装 Python ==
 +
 
 +
早些时候,我们将投票应用程序安装为用户库。 这有一些缺点:
  
早些时候,我们以用户库的形式安装了投票应用。这样做有一些缺点。
+
* 修改用户库可能会影响系统上的其他 Python 软件。
 +
* 您将无法运行此包的多个版本(或其他同名版本)。
  
* 修改用户库会影响你系统上的其他 Python 软件。
+
通常,这些情况只会在您维护多个 Django 项目时出现。 当他们这样做时,最好的解决方案是使用 <span class="xref std std-doc">venv</span>。 此工具允许您维护多个隔离的 Python 环境,每个环境都有自己的库和包命名空间副本。
* 你将不能运行此包的多个版本(或者其它用有相同包名的包)。
 
  
Typically, these situations only arise once you're maintaining several Django
 
projects. When they do, the best solution is to use <span class="xref std std-doc">venv</span>. This tool allows you to maintain multiple isolated
 
Python environments, each with its own copy of the libraries and package
 
namespace.
 
  
 +
</div>
  
 
</div>
 
</div>
 +
<div class="clearer">
 +
 +
  
 
</div>
 
</div>
  
[[Category:Django 3.0.x 中文文档]]
+
[[Category:Django 3.0.x 文档]]

2021年10月31日 (日) 04:09的最新版本

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

本高级教程从 教程 7 停止的地方开始。 我们将把我们的网络投票变成一个独立的 Python 包,您可以在新项目中重用并与其他人共享。

如果您最近还没有完成教程 1-7,我们鼓励您查看这些内容,以便您的示例项目与下面描述的项目相匹配。

可重用性很重要

设计、构建、测试和维护 Web 应用程序需要大量工作。 许多 Python 和 Django 项目都有共同的问题。 如果我们可以保存一些重复的工作,那不是很好吗?

可重用性是 Python 的生活方式。 Python 包索引 (PyPI) 有大量的包,你可以在你自己的 Python 程序中使用。 查看 Django Packages,了解您可以在项目中合并的现有可重用应用程序。 Django 本身也是一个普通的 Python 包。 这意味着您可以使用现有的 Python 包或 Django 应用程序并将它们组合到您自己的 Web 项目中。 您只需要编写使您的项目独一无二的部分。

假设您要开始一个新项目,需要像我们一直在开发的那种民意调查应用程序。 你如何使这个应用程序可重用? 幸运的是,你已经在路上了。 在 教程 1 中,我们看到了如何使用 include 将投票与项目级 URLconf 分离。 在本教程中,我们将采取进一步措施,使该应用程序易于在新项目中使用,并准备好发布供其他人安装和使用。

包裹? 应用程序?

Python package 提供了一种对相关 Python 代码进行分组以便于重用的方法。 一个包包含一个或多个 Python 代码文件(也称为“模块”)。

可以使用 import foo.barfrom foo import bar 导入包。 一个目录(如polls)要形成一个包,它必须包含一个特殊的文件__init__.py,即使这个文件是空的。

Django application 是一个 Python 包,专门用于 Django 项目。 应用程序可能使用常见的 Django 约定,例如具有 modelstestsurlsviews 子模块。

稍后我们使用术语 packaging 来描述使 Python 包易于其他人安装的过程。 这可能有点令人困惑,我们知道。


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

在前面的教程之后,我们的项目应该是这样的:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        apps.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 目录现在可以复制到新的 Django 项目中并立即重用。 不过还没有完全准备好发布。 为此,我们需要打包应用程序以方便其他人安装。


安装一些先决条件

Python 打包的当前状态与各种工具有点混乱。 在本教程中,我们将使用 setuptools 来构建我们的包。 它是推荐的打包工具(与 distribute fork 合并)。 我们还将使用 pip 来安装和卸载它。 您现在应该安装这两个软件包。 如果需要帮助,可以参考如何使用pip安装Django。 你可以用同样的方法安装setuptools


打包您的应用程序

Python packaging 是指以易于安装和使用的特定格式准备您的应用程序。 Django 本身就是这样打包的。 对于像民意调查这样的小应用程序,这个过程并不太难。

  1. 首先,在 Django 项目之外为 polls 创建一个父目录。 调用这个目录django-polls

    为您的应用选择名称

    为包选择名称时,请检查 PyPI 等资源以避免与现有包发生命名冲突。 在创建要分发的包时,在模块名称前加上 django- 通常很有用。 这有助于其他寻找 Django 应用程序的人将您的应用程序识别为特定于 Django 的应用程序。

    应用程序标签(即应用程序包的虚线路径的最后一部分)必须:setting:`INSTALLED_APPS` 中是唯一的。 避免使用与任何 Django contrib 包 相同的标签,例如 authadminmessages

  2. polls目录移动到django-polls目录下。

  3. 创建一个文件 django-polls/README.rst,内容如下:

    django-polls/README.rst

    =====
    Polls
    =====
    
    Polls is a 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.
  4. 创建一个 django-polls/LICENSE 文件。 选择许可证超出了本教程的范围,但可以说未经许可证公开发布的代码是 无用 。 Django 和许多与 Django 兼容的应用程序是在 BSD 许可下分发的; 但是,您可以自由选择自己的许可证。 请注意,您的许可选择将影响谁可以使用您的代码。

  5. 接下来,我们将创建 setup.cfgsetup.py 文件,详细说明如何构建和安装应用程序。 对这些文件的完整解释超出了本教程的范围,但 setuptools 文档 有很好的解释。 使用以下内容创建文件 django-polls/setup.cfgdjango-polls/setup.py

    django-polls/setup.cfg

    [metadata]
    name = django-polls
    version = 0.1
    description = A Django app to conduct Web-based polls.
    long_description = file: README.rst
    url = https://www.example.com/
    author = Your Name
    author_email = yourname@example.com
    license = BSD-3-Clause  # Example license
    classifiers =
        Environment :: Web Environment
        Framework :: Django
        Framework :: Django :: X.Y  # Replace "X.Y" as appropriate
        Intended Audience :: Developers
        License :: OSI Approved :: BSD License
        Operating System :: OS Independent
        Programming Language :: Python
        Programming Language :: Python :: 3
        Programming Language :: Python :: 3 :: Only
        Programming Language :: Python :: 3.6
        Programming Language :: Python :: 3.7
        Programming Language :: Python :: 3.8
        Topic :: Internet :: WWW/HTTP
        Topic :: Internet :: WWW/HTTP :: Dynamic Content
    
    [options]
    include_package_data = true
    packages = find:

    django-polls/setup.py

    from setuptools import setup
    
    setup()
  6. 默认情况下,包中仅包含 Python 模块和包。 要包含其他文件,我们需要创建一个 MANIFEST.in 文件。 上一步中提到的 setuptools 文档更详细地讨论了这个文件。 要包含模板、README.rst 和我们的 LICENSE 文件,请创建一个包含以下内容的文件 django-polls/MANIFEST.in

    django-polls/MANIFEST.in

    include LICENSE
    include README.rst
    recursive-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 的 打包和分发项目教程


使用你自己的包

由于我们将 polls 目录移出项目,它不再起作用。 我们现在将通过安装我们新的 django-polls 包来解决这个问题。

安装为用户库

以下步骤将 django-polls 安装为用户库。 与在系统范围内安装软件包相比,按用户安装有很多优点,例如可以在没有管理员访问权限的系统上使用,以及防止软件包影响系统服务和机器的其他用户。

请注意,每个用户的安装仍然会影响以该用户身份运行的系统工具的行为,因此使用虚拟环境是一个更强大的解决方案(见下文)。


  1. 要安装该软件包,请使用 pip(您已经 安装了它 ,对吗?):

    python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz
  2. 幸运的是,您的 Django 项目现在应该可以正常工作了。 再次运行服务器以确认这一点。

  3. 要卸载软件包,请使用 pip:

    python -m pip uninstall django-polls


发布您的应用

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


使用虚拟环境安装 Python 包

早些时候,我们将投票应用程序安装为用户库。 这有一些缺点:

  • 修改用户库可能会影响系统上的其他 Python 软件。
  • 您将无法运行此包的多个版本(或其他同名版本)。

通常,这些情况只会在您维护多个 Django 项目时出现。 当他们这样做时,最好的解决方案是使用 venv。 此工具允许您维护多个隔离的 Python 环境,每个环境都有自己的库和包命名空间副本。