揭秘 Django 的魔法

已发表: 2022-03-10
快速总结↬在本文中,我们将通过了解生成的文件和文件夹的作用来深入了解 Django 带来的好处,这将使我们更好地了解 Django 框架。

根据官方文档,

Django 是一个高级 Python Web 框架,它鼓励快速开发和简洁、实用的设计。 它由经验丰富的开发人员构建,解决了 Web 开发的大部分麻烦,因此您可以专注于编写应用程序,而无需重新发明轮子。 它是免费和开源的。

— DjangoProject.com

它是 Python 用于构建 Web 应用程序的流行框架之一,并且因其在创建具有规定配置和文件的样板文件时的可伸缩性而最受欢迎。 这为开发人员总结了 Django 的全部目标;

“...在很短的时间内构建一个出色的应用程序,减少对基本设置的担忧。”

无论您正在构建什么,都有跨越所有 Web 应用程序的基本配置、文件和样式。 使用 Django 时,当您在应用程序开发周期的不同时间点运行某些命令时,会自动为您生成这些命令。 这样,您将有足够的时间专注于开发应用程序的核心方面,而 Django 会为您处理其他方面。

这意味着在引擎盖下发生了很多事情。 对于没有完全掌握运动部件的人来说,这可能是压倒性的。 在本文中,我们将学习以下内容:

  • Django的安装
  • startprojectstartapp命令
  • Django 配置文件,其中包括;
    • 设置.py
    • 网址.py
    • 管理.py
  • 模型布局
  • 路由

我们将了解这些如何组合在一起以及它们所扮演的角色。 重要的是要知道不可能查看 Django 内部发生的所有事情。 对于本教程范围之外的案例,将有链接指向您可以帮助解决此问题的资源。

为了学习目的,我们将建立一个电子商务平台。 这不是一个成熟的电子商务网站,我们的应用程序只有两个基本功能; 从管理员的角度创建产品和下订单。

本文将引导您了解 Django 的预构建命令、文件和基础知识。 它面向使用过或打算使用 Django 并想知道幕后发生了什么的开发人员。 虽然您不一定必须使用过 Django,但在继续本文之前拥有 Django 基础知识的经验会给您带来优势。 您需要具备 Python 的工作知识才能完全掌握本文将涵盖的内容。

跳跃后更多! 继续往下看↓

安装 Django

如果您尚未安装 Django,请按照以下步骤操作。

首先,创建一个名为djangodev的虚拟环境。 你需要这个来隔离你的 Django 工作区和它的依赖包。

 python3 -m venv ~/.virtualenvs/djangodev

现在要进入您的虚拟环境,您需要激活它;

 source ~/.virtualenvs/djangodev/bin/activate

如果您在使用source运行时遇到任何错误,您可以使用此替代命令,

 . ~/.virtualenvs/djangodev/bin/activate

对于 Windows 用户,请改用它,

 ...\> %HOMEPATH%\.virtualenvs\djangodev\Scripts\activate.bat

注意:您需要在想要使用 Django 的任何时候激活虚拟环境。

现在你在你的虚拟环境中,安装 Django:

 python -m pip install Django

要检查 Django 是否正确安装,请运行;

 python -m django --version

摇晃! 现在你已经准备好施展魔法了,准备好你的魔杖吧!

随时随地创建文件和文件夹的方法可能简单明了。 但是,当您必须创建一个中型或大型项目并且需要完成最后期限时,这并不理想。 即使是个人项目,我们也总是有一个截止日期。

在创建新的大型项目时,按照这种方法,您将不得不创建多个文件和文件夹并进行多项设置,这可能会导致创建可避免的错误并浪费大量时间。 我们可以通过 Django 使用的startprojectstartapp命令旨在解决这个问题。 这两个命令为您创建文件、文件夹并执行大量配置。

让我们开始使用startproject命令生成一个新应用程序。

脚手架应用程序

我们将生成我们的应用程序并查看生成的文件,以及我们将使用的一些命令。 在终端中运行此命令以开始;

 django-admin startproject ecommerce_site

安装 Django 时,将django-admin添加到您的路径中,以授予其执行操作的权限。 它是 Django 用于管理职责的命令行实用程序。 在这里了解更多django-admin使用; 这有点超出了本文的范围。

startproject是一个帮助生成项目的 Django 命令。 在这里,我们将项目ecommerce_site的名称传递给它。 然后它继续在名为ecommerce_site的目录中创建项目。 目录应该是这样的,

在 startproject 之后显示目录。
运行 startproject 后显示文件夹。 (大预览)

我们需要导航到新创建的目录并运行命令来生成应用程序

 cd ecommerce_site python manage.py startapp trading

startapp是项目目录下manage.py执行的命令,它创建多个文件,以及一个使用命令中指定的名称命名的文件夹,在本例中,指定的是trading 。 app 文件夹包含创建应用程序功能所需的简单文件。 现在你的目录应该是这样的:

在 startapp 之后显示目录。
运行 startapp 后显示文件夹。 (大预览)

如果您想知道项目和应用程序之间的区别。 一个项目是一个 Django Web 应用程序,它可以包含一个或多个应用程序。 它是包含manage.py的文件夹和包含settings.py和其他文件的其他模块。 应用程序是具有特定功能的 python 包,包括诸如models.py迁移目录等文件。 您可以在 Stack Overflow 上查看此答案以获取更多信息。

startproject将创建主项目目录,而startapp将创建 app 目录。 两者也都被传递了一个名称以供一代人使用。 startproject是创建新项目时运行的第一个命令,而startapp在新项目目录中运行。

当前布局是一个很好的映射,您可以将其用于您正在构建的任何应用程序。 它是可扩展的,由您需要的文件组成。 有机会在项目中创建、重命名、编辑和移动文件。

Django的配置

Django 为您提供了不同的设置和配置,在不同文件中运行这两个命令后,让我们运行生成的文件以了解每个文件的作用。

settings.py

大多数 Web 应用程序需要像这样的配置; 身份验证以验证用户,权限以允许某些用户具有某些能力并设置安全标准。 所有这些都是为您的用户提供所需的最佳体验所必需的。 作为开发人员,您需要很长时间才能开始为您开发的每个应用程序自行推出每一项。

Django 为您提供了这些所需的配置以及更多 - 这样您就可以选择您想要的配置并将它们插入。这些在settings.py中完成,已经创建了一些设置来为您提供基本功能。

当 Django 尝试运行一个项目时,它会寻找某些变量。 settings.py是保存那些导致其他文件或信息的变量的文件。 Django 从manage.py文件定向到该文件,并获取信息或加载从此处引导到的其他文件。

这些配置包括:

  • DEBUG
    DEBUG功能设置为True以便在开发中读取错误和调试代码,在生产期间(即部署时)应将其设置为False 。 此设置允许您在 Django 尝试运行您的代码时更好地调试您的代码。
  • INSTALLED_APPS
    这是在 Django 中执行特定功能的所有应用程序的列表。 它带有一些默认应用程序,例如用于用户身份验证的'django.contrib.auth' django.contrib.admin' ,用于管理功能的 django.contrib.admin,以及向用户发送通知或信息所需的'django.contrib.messages' 。 您使用startapp命令创建的任何其他应用程序都必须在此处才能由 Django 运行。
  • MIDDLEWARE是一个轻量级框架,用于处理通过 Django 请求和响应的输入和输出。 每个中间件对应用程序执行特定功能,例如'django.contrib.auth.middleware.AuthenticationMiddleware''django.contrib.sessions'一起使用以将用户与请求相关联。 您应该查看文档中每个中间件的更多功能。
  • ROOT_URLCONF是一个路径变量,当请求被传递给你的 Django 应用程序时,Django 会在该路径中查找你的urlpatterns 。 每当在 Django 应用程序中发出请求时,Django 都会搜索此变量并加载前导文件并循环通过urlpatterns列表来搜索匹配的路径。
  • TEMPLATES是允许呈现 HTML 文件以表示视图的设置。 它与请求、身份验证和消息应用程序进行通信。 'BACKEND'值和'APP_DIRS'设置为True使 Django 能够在/templates文件夹中搜索 HTML 文件。 OPTIONS中的'context_processors'callables ,它将请求作为参数接收,并在呈现模板时将其与上下文合并,这些 callables 通常有助于调试、身份验证和处理请求。
  • WSGI_APPLICATION是通向wsgi.py文件中application变量的路径。
  • DATABASE是一个字典,它可以访问外部数据库(或在默认 sqlite 的情况下为内部数据库),如 PostgresSQL、MySQL 和 MongoDB。 这是一个 Postgres 数据库的示例,我将在我们的示例中使用:
 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'db_name', 'USER': 'db_user', 'PASSWORD': 'db_password', 'HOST': 'localhost', 'PORT': '', } }

您可以决定使用默认的 sqlite 数据库,这对生产来说不是很好。 您可以像上面一样设置 Postgres 数据库,您必须先创建数据库并将用户、密码和具有写入权限的数据库传递给数据库。

注意就本教程而言,您可以使用默认的 sqlite 数据库集。 以上是关于如何在 Django 中设置 SQL 和 NO-SQL 数据库连接的演示。

  • AUTH_PASSWORD_VALIDATORS这些是用于密码验证的函数。 在创建用户(以及管理员)记录、重置和更改密码时调用它们。 您可以从官方文档中了解更多关于它们的信息。

可以在此处找到有关设置的更多文档。

manage.py

大多数 Web 项目都需要一个命令开始的入口点。 充当应用程序网关的入口点。 在每个 Django 项目中,它通常是manage.py文件。

需要此文件作为应用程序的起点。 从这里开始,所有命令都运行,一切都从这里开始。

manage.py的功能与 django-admin 相同。 它还告诉 Django 您在应用程序中拥有的配置的位置。 这是默认设置的,不需要更改。

它使用def main()函数来处理我们的settings.py文件的默认设置模块。 它尝试导入执行函数,如果遇到错误,它会抛出ImportError 。 否则,它会接受sys.argv从命令行传递的任何参数并执行。

sys.argv是一个列表,它接收通过终端传入的命令。 当我们在命令行中运行python manage.py runserver时, sys.argv被设置为["manage.py", "runserver"]并被传递给execute()函数。

python manage.py startapp tradingpython manage.py makemigrations等参数分别设置为[ "manage.py", "startapp", "trading"]["manage.py", "makemigrations"]以执行。

如果给定的命令设置为manage.py ,则 if 语句设置为运行。

除了运行django-admin功能之外,您还将在运行服务器、处理迁移和项目将使用的其他命令中使用它。 在部署、测试和调试项目时,您也将需要它。

模型布局

Django 为您提供了一个简单的建模布局。 您在trading目录的models.py文件中配置您的模型。 您的类(或模型)是您的数据库表将遵循的布局。

您可以根据要从每个表的用户(或管理员)获取的数据类型来定义类。 我们的模型创建了一个与settings.py中的DATABASE变量一起使用的迁移文件。

让我们为产品和订单创建两个我们需要的模型:

 from django.db import models class Product(models.Model): name = models.CharField(max_length=50) image = models.ImageField(upload_to='products', default='python.png') price = models.IntegerField() description = models.TextField() def __str__(self): return self.name class Order(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE) quantity = models.IntegerField() date = models.DateField(auto_now_add=True) user = models.CharField(max_length=50) def __str__(self): return self.user

产品模型具有名称、价格、描述和图像(保存时将上传到products文件夹。如果该文件夹不存在,则会创建)列。 该order有一个product (链接到products表)、数量、日期和用户列。

有了这些信息,Django 为应用程序创建了一个数据库模式。 此外,创建一个 Python 数据库访问 API 来访问 Product 和 Order 对象。 Django 有一个内置的迁移工具,因此您不必使用外部包进行迁移。

下一步是运行迁移命令并迁移到数据库。 但在我们这样做之前,我们必须在我们的项目目录中将trading注册为一个应用程序。

首先,我们必须将交易目录配置为 Django 中的应用程序。 Django 在app.py文件中为您完成了这些工作。 该文件将trading注册为应用程序,并将在settings.py文件中进一步使用。

现在,在settings.py添加trading INSTALLED_APP 。 它应该如下所示:

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

在终端上,运行:

 $ python manage.py makemigrations trading $ python manage.py migrate

注意:您的虚拟环境必须已激活,并且您应该在项目目录中。

python manage.py makemigrations trading记录交易模块中所做的更改,并在模型models.pypython manage.py migrate中的更改的migration文件夹中创建一个文件,然后更新更改。

您可以在名为0001_initial.pymigration目录中找到从python manage.py makemigrations trading命令生成的迁移文件。 您可以将类和列视为文件内的创建命令。 随着对models.py的更多更改,这里将生成更多文件。

管理员功能

在我们当前的应用程序中,我们需要管理功能来管理将在应用程序中创建的产品和订单。 Django 为我们提供了一个内置的管理功能,供我们使用。 管理应用程序(功能)也已在我们的INSTALLED_APP列表中注册; 'django.contrib.admin'

此外,admin 的 URL 也已在我们的 URL 配置文件urls.pyurlpatterns列表中注册; path('admin/', admin.site.urls), admin.py文件使您可以注册模型和要在模型上执行的 CRUD 操作。

要设置管理员,请在终端上运行:

 $ python manage.py createsuperuser

系统将提示您输入用户名、电子邮件和密码。 之后,您已成功创建管理员。 要开始使用管理功能,请运行服务器:

 $ python manage.py runserver

访问 https://127.0.0.1:8000/admin/ 将导致登录会话,当您登录(使用您创建的用户名和密码)时,您将被定向到管理仪表板:

这显示了管理仪表板。
由 Django 提供的管理仪表板。 (大预览)

组和用户是允许管理员访问用户管理和权限的默认配置。 现在让我们注册我们的模型。

admin.py中,添加以下行:

 from django.contrib import admin # Register your models here. from .models import Product, Order admin.site.register(Product) admin.site.register(Order)

from django.contrib import admin从 Django 导入管理功能,然后我们从models.py导入这两个类并注册它们,以便管理员可以对产品执行 CRUD 操作并从仪表板订购。

注册模型后,您的仪表板应如下所示:

显示带有产品和订单模型的管理仪表板。
管理仪表板上的产品和订单模型。 (大预览)

添加产品:

这显示管理员向站点添加产品。
管理员将产品(鞋)添加到站点。 (大预览)

从管理仪表板下订单:

显示管理员下订单的图像。
管理员添加/下订单。 (大预览)

轻松路由

每个站点都需要指向特定页面的路由或 URL,并为最终用户提供某些信息。 在特定路径中访问类似信息或应用程序的集合。 需要将路由组合在一起以实现文件内的可访问性和通信。 Django 在urls.py文件中为您完成了这些工作。

urls.py是从settings.py中的ROOT_CONF变量引导的文件。 这是我们完成主要 URL 配置的地方。 当我们在不同的文件或文件夹中,甚至在urls.py文件中创建视图时,它们必须在urlpatterns列表中进行配置。

Django 期望文件中有一个名为urlpatterns的列表。 您可以将ROOT_CONF变量中的文件更改为您放置urlpatterns列表的任何其他文件。

 urlpatterns = [ path('admin/', admin.site.urls), ]

该列表由作为pathre-path实例的对象组成。 每个实例都有两个强制参数,模式'admin/'和一个视图或 URL 文件admin.site.urls

这些实例也可能导致另一个具有更多 URL 配置的文件。 这样做是为了可读性。

views.py

后端应用程序的一个重要需求是每个路由映射到的视图。 在 Django 中,您可以在views.py文件中为应用程序编写基于函数或类的视图。 视图是处理请求并将响应发送回用户的类或函数。

将您的views.py文件编辑为:

 from django.http import HttpResponse def home(request): return HttpResponse("This is a shopping site for products") def order(request): return HttpResponse("Hello, welcome to our store, browse to our products and order!")

这里我们导入了HTTPResponse来定义两个视图(函数视图)在调用时返回语句。 访问主地址时应调用def home ,访问订单URL时应调用def order

创建视图后,我们需要将其分配给不同的路由(或urlpatterns )。 这可以通过多种方式完成,我们可以在同一个文件中创建一个urlpatterns列表,或者我们可以将trading.views导入ecommerce_site.urls文件并创建路径。

这样做的首选方法是创建一个子 URL 配置文件(内部trading ),并将其包含在ecommerce_site.urls中。 在trading目录中创建一个urls.py文件。 您的目录应如下所示:

 trading/ __init__.py admin.py apps.py migrations/ __init__.py 0001_initial.py models.py tests.py urls.py views.py

将以下代码添加到您的新文件 ( urls.py )

 from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), path('order/', views.order, name='order'), ]

让我们在项目 URLs 配置文件中注册trading URL 配置文件( urls.py ),

 from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('', include('trading.urls')) ]

为了能够访问urlpatterns ,我们将在第 2 行中使用django.urls中的include类。然后选择一个模式并将urls.py文件附加到交易目录中。

我们在这里所做的是从 django 导入path类和views.py文件。 然后我们的列表包含每个视图的两个路径实例。 所以def home在 https://127.0.0.1:8000/ 上被调用。

当您访问网站主页时显示的图像。
访问主页时的站点。 (大预览)

在 https://127.0.0.1:8000/order/ 上调用def order

当您访问订单 URL 时显示网站。
访问的订单 URL。 (大预览)

注意:运行startprojectstartapp的过程不是强制性的,但 Django 强烈鼓励。 您可以在运行每个命令后创建/移动文件和文件夹以方便您的工作。

依赖树

以下是 Django 处理来自 URL 的请求的过程:

  1. Django 在ROOT_CONF变量中搜索 URL 的根位置(路径)。
  2. Django 加载提供的路径中给出的 python 文件。 并找到urlpatterns变量,这是一个包含django.urls.path()和/或django.urls.re_path()的所有实例的列表。
  3. 在列表中,Django 按顺序查找匹配的 URL。
  4. Python,导入和调用视图(基于函数或基于类的视图)。 通过 HTTP 请求进一步传递。
  5. 视图处理传递的请求和信息,并返回消息/模板或重定向到另一个视图。
  6. 如果没有匹配的 URL 模式,或者在此过程中的任何时候引发异常,Django 调用适当的错误处理视图。
显示 Django 如何处理请求的树。
Django 请求处理。 (大预览)

结论

我们已经了解了在没有命令行的情况下为 Django 创建文件的可能性。 我们还了解了 Django 项目的优势和构建块。 Django 是构建后端项目的一个了不起的工具,其目标是创造简单性。

您可以在 GitHub 上查看本教程的代码。

资源

  • Django中的密码管理
  • Django:入门
  • Django:设置
  • O'Reilly 的轻量级 Django