Django 的 0–100:以正确的方式启动应用程序

Django 的 0–100:以正确的方式启动应用程序

原文:https://medium.com/hackernoon/0-100-in-django-starting-an-app-the-right-way-badd141ef439

在我们上一个教程中,我们介绍了如何设置一个基本的 Django 项目。现在,您应该有一个如下所示的目录:

0to100
├── CHANGELOG.rst
├── .gitignore
├── .git
│   └── HEAD
│   ...
├── README.rst
├── docs
├── requirements
│   └── base.txt
├── setup.py
└── tutorial
    ├── manage.py
    └── tutorial
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py4 directories, 9 files

启动你的应用

Django 项目的教程很好地介绍了如何创建你的第一个应用,但是他们忽略了一些重要的概念。为了简洁和快速,本教程没有解释所有的内容,而是跳过了很多内容。在我们开始构建 app 之前,到底什么是 app?

了解什么是应用程序。

首先要明白 app 到底是什么。与大多数 MVC(或 MTV)框架不同,Django 强迫你将代码分解成独立的“应用程序”这些应用程序应该是完全独立的,可重用的,可插入的。这非常有用,因为这意味着您可以在多个项目中共享功能。

例如,假设你有一个博客应用程序和一个照片库应用程序。现在,您可能希望在这两者中添加一个共同的功能,那就是为照片和博客文章添加“标签”的能力。现在,您可以将该功能写入两个应用程序中,最终得到一堆做完全相同事情的重复代码。Django 的首选方法是添加一个名为“tags”的新应用程序。这个应用程序将包含与添加、删除和编辑来自其他应用程序的标签相关的所有数据和逻辑。

这种自我包含的能力也意味着你可以与他人共享你的代码,他们也可以使用它。例如,如果你不想写你自己的标签库,你可以运行pip install taggit,现在你有了一个别人写的独立的标签库。由于 taggit 的编写方式,它可以用于任何其他应用程序。

你怎么决定什么应该是一个 app?

这可能是 Django 新开发者面临的最大问题。你怎么知道什么时候某些功能应该被拆分?由于编程的性质,这方面没有硬性规定。我通常遵循的想法是:“如果你不能用一句话来解释你的应用程序是做什么的,那么它应该不止是一个应用程序”,到目前为止,这个想法对我很有用。

startapp 的工作原理

那么足够的散文和理论,让我们实际上写一些代码!要在 Django 中启动应用程序,请确保您位于第一个“教程”文件夹中。从现在开始,我将把它称为你的 django 项目文件夹’(带有manage.py的那个)。此文件夹将存放您的所有应用程序。现在运行:

$ python manage.py startapp polls
$ ls
db.sqlite3  manage.py  polls  tutorial

现在你可以看到我们现在有了一个名为polls的新文件夹。虽然看起来 startapp 做了一些神奇的事情来创建这个应用程序,但实际上并没有。所发生的只是用提供的名称创建一个文件夹(即 polls),复制一些文件,并添加一个配置文件(apps.py)。事实上,您可以在终端或文件浏览器中创建自己的应用程序,只需创建 1 个文件夹和 2 个文件。一个应用程序文件夹所需要的就是文件夹、一个__init__.py和一个apps.py

创造了什么?

那么startapp究竟创造了什么?让我们来看一看并分解每个文件:

$ tree polls
polls
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

首先是 admin.py 文件。这个文件是你放置所有 Djangos 内置管理配置的地方。

接下来是 apps.py,这个文件用于 Djangos 内部的 app registery,主要用来存储元数据。在大多数情况下,你不会修改这么多。

然后我们有了 init。py 文件。这个文件实际上是 Pythons 确定模块的约定。当你尝试运行import libraryfrom library import x时,Python 会搜索 Python 路径中的所有文件夹。如果文件夹有 init。py 文件,Python 也将在该文件夹中搜索,否则它将被忽略。因此,如果我们希望能够从我们的polls应用程序导入代码,我们需要 init.py。

现在我们有了迁移文件夹。迁移是 Django 构建数据库的方式。我们将在后面讨论这个问题,但是当我们开始处理模型时,您会看到“迁移”被添加到这个文件夹中。

然后我们有了 models.py 这个文件是你应该存储与这个应用程序相关的所有模型的地方。模型是 Django 理解数据库的方式,也是您希望数据存储的方式。

接下来我们有测试。有时你会看到这是一个测试文件夹。该文件/文件夹用于添加单元和集成测试。这是我们将在后面更详细讨论的内容,但基本上,测试是您编写的代码,以确保您的代码按照您期望的方式运行。

最后我们有的观点。这是存储我们所有业务逻辑的文件。我们将在这个文件中定义与这个应用程序相关的所有视图,包括基于类的视图和函数视图。在其他框架中,您可能会将 Djangos 视图称为“控制器”。

等等,还没完,是吗?

如果您以前使用过 Django 或其他 MVC 框架,您可能会注意到缺少了一些东西。没有地方存储静态文件或模板(其他框架中的视图)。默认情况下startapp不会创建这些,但是您可以通过运行:

$ mkdir static templates
$ ls
admin.py  apps.py  __init__.py  migrations  models.py  static  templates  tests.py  views.py

这工作得非常好,现在 Django 会自动开始在polls/static中寻找静态文件,在polls/templates中寻找模板。

为了便于组织,你也可以添加更多的文件!我将回顾其他几个相对常见的文件:

  • urls.py —用于存储应用程序特定的 URL 到视图的映射
  • forms.py —通常用于存储 Djangos 表单库子类
  • signals.py —常用于存储 Django 中的信号
  • api.py — 第三方库 line Django Rest Framework 和 TastyPie 常用来存储 api 信息。
  • managers.py —用于存储查询集管理器

此外,许多第三方应用程序使用类似于 api.py 的独立文件来存储每个应用程序的配置。

注册您的应用程序

现在你已经创建了一个应用程序,你知道它的功能,但是 Django 仍然不知道你的应用程序!为了让 Django 知道你的应用程序,你需要编辑tutorial/settings.py文件。一旦你打开搜索INSTALLED_APPS,你应该会看到一个类似这样的部分:

INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
]

这是你启动时 Django 将使用的所有应用程序的列表。为了让 Django 知道你的新投票应用程序,只需在列表末尾添加'polls',:

INSTALLED_APPS = [
     'django.contrib.admin',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'polls',
]

就是这样。您已经正式创建了一个全新的应用程序,并使其与 Django 兼容!它还没有做很多事情,但是我们将在下一个教程中开始解决这个问题。


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除