
也许您听说过Django,它可以帮助您建立网站。您可能不熟悉Python,不熟悉Web开发或不熟悉整个编程。
这个新系列“了解Django”将向您展示Django的全部内幕。在本系列文章中,我希望揭示Django是一个功能强大的工具,可以释放任何有兴趣在Internet上制作应用程序的人的潜力。
我们将采用高级方法进行学习。我将向您展示全局,而不是从Django的所有底层开始,然后越来越深入地探索每一层,以揭示Django在后台为开发人员做了多少工作。
让我们从用户的互联网体验的最顶端开始:在网络浏览器上。
发出浏览器请求
Django是一个Web框架,但这到底意味着什么?网站如何运作?我将无法遍历所有细节,但是这篇文章将解决一些琐碎的问题。我们将研究您的网络浏览器从互联网请求数据的方式,以及实现该功能所需的“管道”。了解这些关键词和术语之后,您应该能够开始自主研这些主题。
互联网的目的是满足用户对信息的需求。该“信息”采取许多不同的形式。有可能是:
YouTube上的猫咪视频
来自社交媒体的政治轰鸣
约会网站上其他人的个人资料
无论人们在寻找什么,信息都是通过相同的机制传输的。在互联网上,所有类型的信息和数据都落在了资源的范畴内。
简而言之,我们获取资源的方法是使用统一资源定位符或URL。即使您不知道这个名称,也知道URL是什么。
https://www.mattlayman.com/
https://zh.wikipedia.org/
https://www.djangoproject.com/
这些都是URL的示例。通常,我们称它们为网址。URL是Internet上某些资源的地址。当您点击浏览器地址栏上的Enter键时,您的意思是“浏览器,请告诉我。”换句话说,我们向浏览器发出请求。此请求启动了一系列事件,因此该URL上的资源可以吸引您的注意。
这个系列动作里有什么?承载了很多东西。在本次讨论中,我们将省略很多层次,因为我猜您并不打算深入探讨网络电缆中电信号的工作方式。取而代之的是,让我们现在专注于该动作的这两部分:DNS和HTTP。
名称名称名称
URL代表您想要从Internet获得的资源。互联网如何知道资源的来源?这就是DNS的由来。DNS代表域名系统。重要的单词是“名称”。让我们回到地址的类比。
在邮政地址(至少从美国的角度来看)中,有街道,城市和州。我们可以这样写:

123 Main St. 伊利诺伊州(IL)的斯普林菲尔德市。
同样,URL也适合类似的格式。 
术语不同,但是从狭义到广义的概念是相同的。标点之间的每一部分都是一种领域。让我们以相反的顺序查看它们。
com被视为顶级域名(TLD)。TLD由一个称为ICANN的特殊小组精心管理。
example 是域名。这是互联网上服务的主要身份,因为它是用户可能会识别的特定标识符。
www被视为域的子域。域可能包含许多此类内容,例如www,m,mail,Wiki或域所有者可能想要命名的任何名称。子域的深度也可以大于1,因此a.b.example.com是有效的,并且a和b都是example.com的子域。
域名不是计算机通信的方式。域名是对人类“友好”的东西。计算机系统被设计为和数字打交道,因此必须将这些域名转换为可管理的名称。为此,Internet使用DNS服务器系统(专用计算机)充当域名和计算机网络使用的数据之间的转换层。
也许您已经看到了这些网络号码。这些数字称为IP地址,是Internet Protocol地址的缩写。常见示例包括:
这些示例很特殊,因为它们位于特别指定的子网中,但我们将它们放在一边。如果愿意,您可以自行深入研究该主题。
回到DNS,系统将获取域名,并在整个DNS服务器集合中保持名称到IP地址的分布式路由表。等一下,什么?
DNS服务器堆叠成一个巨大的层次结构。当您的浏览器发出请求时,它会向最近的DNS服务器询问您请求的域名的IP地址。DNS服务器会在一段时间内保留从IP地址到域名的查找表。如果该域名不在表格中,它可以请求链中的另一台DNS服务器,该服务器将继续寻找该域的IP地址。这导致了两个结果:
如果所有服务器都找不到该域,浏览器将放弃并显示诸如“ 我们无法找到该站点。”(来自Firefox的“服务器未找到”页面)。
如果浏览器从DNS服务器获取IP地址,则可以继续该请求。
这个过程经过简化,以排除DNS的某些晦涩的知识点,但是希望您能理解。
我们要发送什么?
我知道我们仍未与Django对话,但我保证我们会的。互联网传输路径自上而下有很多分层,但我认为这些基础知识有助于解开互联网(和Django)运转的谜团。
我们需要探讨的另一部分是HTTP或超文本传输协议。互联网通信的这一部分描述了内容如何在浏览器和服务器之间或更通用地讲在使用该协议的任何计算机之间传输。
该协议使用标准格式和一组命令进行通信。一些常见的命令是:
GET-获取资源
POST-将数据发送到资源
删除-请求删除资源
如果您访问我的网站https://www.mattlayman.com/about/,则浏览器将发送如下请求:

我还省略了其他部分,我们从这里入门。第一行提供命令,网站上特定资源的路径(即/ about /),以及要使用的协议版本。
第一行之后是请求头。一般的浏览器用户从不会看到标头,但是标头是多余的数据,可以告诉服务器更多有关请求的信息。对于HTTP 1.1,需要Host标头,因为它标明了发出请求的位置,但其他标头是可选的。
在示例中,我还显示了Accept标头。此标头告诉服务器浏览器可以接收什么样的内容作为响应。还有其他标头可以告诉服务器它还应该“知道”什么。这些标头可以:
大多数标头是由浏览器和服务器自动处理的,但是我们会看到一些实例,我们希望自己使用这些标头,因此了解它们的存在是很有用的。
提供响应
现在该讨论Django!现在,我们对浏览器的功能有了一个大概的了解。浏览器将HTTP请求发送到由DNS系统解析的URL。该请求到达绑定域名IP地址的服务器。Django运行在在这样的服务器上,并负责通过HTTP响应来答复请求。
响应就是浏览器用户想要的。响应可以是图像,网页,视频或浏览器可以处理的任何格式。
在Django处理请求之前,需要通过更多层:Python Web服务器。
HTTP遇到Python的地方
Web服务器是设计用于处理HTTP请求的计算机软件。有时,此术语可能会造成混淆,因为人们还可能将名称“ Web服务器”应用于正在提供服务的整个计算机。在本例中,我指的是实际的程序监听和响应Web请求。
像Django这样的Python网络框架可与网络服务器一起运行。网络服务器的作用是将原始HTTP请求转换为框架可以理解的格式。在Python世界中,存在一种特定的格式,因此任何Web服务器都可以与任何Python Web框架进行通信。该格式是Web服务器网关接口或WSGI(通常称为“ wiz-gee”)。

Web服务器网关接口
WSGI使通用Web服务器(如Gunicorn,uWSGI或mod_wsgi)能够与通用Python Web框架(如Django,Flask或Pyramid)进行通信。如果您真的想探究到底,可以在PEP 3333中探索该格式的所有详细信息。
Django的工作
Web服务器发送请求数据后,Django需要返回响应。作为Django开发人员,您的角色是定义服务器上可用的资源。这意味着您必须:
描述Django将响应的URL集。
编写为那些URL提供响应的代码。
在这两个语句中有很多内容需要分解,因此我们将在以后的文章中探讨各个主题。到目前为止,我希望您对如何将请求从浏览器发送到运行Django的计算机有所了解。

本文相对来说没有代码示例的,这是有充分理由的。已经有足够多的概念需要解释,我不想在上面增加代码复杂性。编写该代码将是本系列文章的重点,因此我们可以回答以下问题:
我们如何构建网页并使所有内容具有共同的外观和感受?
用户如何与应用程序交互并发送该应用程序可以响应的数据?
Django如何存储和检索数据以使站点动态化?
谁可以访问该应用程序,并且该访问如何受到控制?
我们需要增加什么安全性措施以确保用户信息的安全和私密?
我们可以通过翻译成多种语言来使整个世界都能访问应用程序吗?
Django提供了所有这些答案以及更多方法。Django的理念是包含所有必要的内容,以制作完整的Internet网络应用程序。这种“内置电池”的哲学使Django如此强大。同样的理念也可能使Django显得尾大不掉。我在本系列文章中的目标是逐步增加您对Django的理解,以便您可以提高工作效率并继续开发自己的Web应用程序。
在下一篇文章中,我们的重点将放在应用程序将响应的URL上。我们会看到:
如何声明网址。
如何对相关网址进行分组。
如何从返回响应的代码可以使用的URL中提取信息。
如果您希望继续阅读本系列丛书,请随时订阅我的新闻通讯,并在其中发布所有新内容。如果您还有其他疑问,可以在Twitter上通过@mblayman与我在线联系。
设定
在本系列中,我将有大量的代码示例,但我不会展示如何使Django从头开始运行。相反,我将在本文中添加一些入门说明,以便将来您可以继续学习。
我们将使用终端来运行命令。Windows,macOS和Linux都有些不同。我在这里显示macOS,因为这就是我的运行方式。美元符号($)是bash终端的传统起始字符,因此当我列出命令时,请勿键入该字符。我会尽量提供标记并突出差异。
我们需要一个放置工作的地方。由于该系列称为“理解Django”,因此我将使用该名称。使用任何对您有意义的东西。

接下来,我们将Django安装到虚拟环境中,来保证项目代码与其余已安装的Python包分开。

这可能会更改您的终端提示符,现在以(venv)开头,以告诉您虚拟环境正在使用中。其他操作系统以不同方式激活虚拟环境。查看venv模块文档以获取有关您的操作系统的更多信息。
安装Django!

Django提供了一些工具来快速启动项目,我们可以使用这些工具。我们将运行一个命令以使其继续进行。

该命令表示“在当前目录(.)中启动一个名为'project'的项目。”该命令完成后,您应该具有一些文件和布局,如下所示:

要检查框架是否正常工作,请尝试:

如果您将该URL复制并粘贴到浏览器中,应该会看到一个欢迎的开始页面!
我们需要的另一件事是一个“应用程序(app)”。这是(可能令人困惑)项目中Django组件的名称。您需要记住的是,一个Django项目包含一个或多个应用程序。
让我们创建一个可以使用的应用程序:

最后,我们必须将该应用程序配置到Django的项目设置中。打开project / settings.py,找到INSTALLED_APPS并追加到列表中,如下所示:

就我们下一篇文章中的代码示例而言,这已经足够了。我们有一个可以在本地运行以进行测试的Django项目,该项目已通过其第一个应用程序进行了配置。希望在谈论建立URL和资源的文章中再见!
英文原文:https://www.mattlayman.com/understand-django/browser-to-django/
译者:QL