假设你已经读完了前一篇文章——

你的手上现在应该有:一个可以用来运行 Django 的环境,和一个空白的 Django 项目。在上一篇文章的示例中,环境叫做 django-tutorial,而项目叫做 onlineExperimentTutorial

来都来了,接下来认识一下 Django 吧(

0 但是要先讲讲网站和网页

假如你现在对网站和网页什么的一无所知的话,这是一个快速的、并不严谨的小科普。

首先思考一个问题:当你打开一个网站的时候,网站怎么知道要把什么东西发给你呢?

为了回答这个问题,举个例子好了。你在浏览器里输入了 https://bcmonomial.xyz/ ,这个请求通过一系列网络协议抵达了网站的主机,于是主机开始解析这个地址,并发现这个地址对应的是网站的首页,所以向你发送了网站的首页。而你现在正在看的这个页面,地址是 https://bcmonomial.xyz/shelf/Django-tutorial-1.html ,主机收到了这个地址,并知道了这个地址对应的是这篇文章,所以把这篇文章的内容发给了你。

在上面的例子中,网站自己的主机是提供服务的一端,因此被称作服务器Server),而用户访问网站的机器是请求服务的一端,也就是客户端Client)。

所以,不管一个网站的功能怎么复杂,怎么花哨,我们最终都可以把它简化为这样一个流程:客户端发送请求 - 服务器解析请求 - 服务器返回内容。当然这中间还有其他的很多细节,不过为了我们的最终目标来说,简化到这个程度比较容易理解。

我们需要关心的东西,自然也就是后面两段:(1)服务器怎么解析请求?需要把什么样的请求解析到什么位置?(2)服务器应当返回什么内容?

1 再来说说 Django

很显然,Django 作为承载网站本体的软件,它是服务端的东西。你现在就可以启动你的 Django 服务器看一看。

1.1 启动 Django 服务器

在 Anaconda 中,打开虚拟环境所对应的终端(Terminal),cd 到你项目的目录,运行这一行命令:

python manage.py runserver

如果你忘了怎么打开你的项目的话,复习一下 cd 指令的使用。如果你不知道怎么激活虚拟环境的话,回到上一篇教程看看。

如果你已经相当熟悉编程,你也可以使用 PyCharm 的默认终端来操作这个指令——这样做会更加直观,但门槛更高,因此本文不作介绍,默认接下来的所有指令都是在 Anaconda 的 Terminal 中运行的。关于在 PyCharm 中配置项目默认环境的操作请自行搜索。

正常的话,你能看到你的终端里输出了一大堆东西。先不用管,打开浏览器输入 127.0.0.1:8000,你能看到一个页面:

空白 Django 项目的默认页面

这是 Django 的初始页面。恭喜你,你已经成功拥有了一个能访问的网站了!

1.2 讲讲 Django 的结构

好,假如说我们现在想写一个 Hello World 的页面,并且想让它作为整个网站的首页,我们要怎么做呢?

我们需要先了解一点 Django 网站的架构,或者说,Django 如何解析请求并返回内容

Django 架构

这是 Django 的架构示意图。Django 有三个核心的组件:视图(View)模板(Template)模型(Model)

可以看到,我们所有业务的核心都集中在 Django 的视图中。它负责了和用户的交互,同时负责向模板和模型下发指令,从中读取需要的东西,并最终生成需要提供给用户的内容。Django 网站上的所有内容,最终都是通过视图返回给用户的。

所以说,如果我们想要写一个 Hello World,其实只需要写一个这样的视图就行了。我们甚至不需要上模板和模型,我们只需要让视图在任何条件下都返回一个 Hello World 就可以。

以下内容改编自菜鸟教程——Django 创建第一个项目

在我们的项目里,新建一个文件:views.py,内容如下:

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world! ")

在这里,我们定义了一个叫做 hello 的视图,要求它在接收到任何请求的时候都返回一句 Hello world!

然后,我们需要让 Django 知道什么时候调用这个视图,所以我们需要设置 URL。

URL 是什么?如果你不想深入研究的话,你可以直接把它理解为网址。在这里,我们需要手动指定什么样的网址能够访问什么样的视图。

打开项目里的 urls.py,你会看到一个初始的 URL 文件。

啊对其实我也用上 PyCharm 了,注意这里的 import 被折叠了,实际上里面是有内容的

让我们把文件修改成这样:

from django.contrib import admin
from django.urls import path
from . import views # <<<< import 我们刚刚新建的 views

urlpatterns = [
path("admin/", admin.site.urls),
path("", views.hello, name="hello"), # <<<< 添加一个 URL
]

在这里,我们新建了一个路径(路径的具体定义是空的 "" ——也就是网站的默认首页),并把这个路径导向了 views.py 里面的 hello 视图。

如果你在这个过程中没有关掉服务器,你会发现服务器自动重载了。如果你关掉了,那就再启动一下,然后访问 127.0.0.1:8000 再看看。

Hello world!.png

这是一个相当简单的视图——我们甚至没有用上模板和模型,直接就返回了一个 Hello World。

1.3 补充:Django 中 URL 和视图之间的关系

很简单,让我们现场修改一下刚刚的 views.py

    path("hello/", views.hello, name="hello"),

然后,再次访问 127.0.0.1:8000 :

它 404 了

没错,它 404 了,找不到首页了。

而聪明的你估计已经想到它现在在哪了:127.0.0.1:8000/hello

确实在这里

所以,在 Django 中,用户的每一个请求会首先交由 urls.py 进行检查,在其中找到匹配的对象之后,再交由对应的视图来处理。

2 再想想,我们的需求是什么?

接下来,忘掉刚刚我们写的代码,回到一开始——我们需要一个什么东西来着?

我们需要一个可以接收数据,并把数据存储到数据库里的系统。

结合 Django 的结构,你应该已经想到了一个基本的处理思路:新建一个视图,数据可以被上传到这个视图内,再让这个视图将数据转存到模型中。很好!

或许到这里,你可以自由地探索一下,我们要怎么实现这个功能呢?在这个过程中,有几个重要的步骤呢?

  • 如何让实验程序发出数据?
  • 如何建立并管理 Django 模型?
  • Django 视图如何接收实验程序的数据?如何处理这些数据?如何储存这些数据?

下一篇里,我们会来一点点探索如何实现上面的功能,构建一个完整的实验系统。但在这之前,或许你自己的尝试会更重要一些?你可以先结合网上的各种资源和教程,研究一下你分别需要什么,如何把你需要的东西组合在一起。或许这样,你会对整个架构有更深的理解。

最后修改:2024 年 08 月 24 日
虽然点赞什么的确实没什么意义但是也可以点一个再走呗?(