假设你已经读完了前一篇文章——
你的手上现在应该有:一个可以用来运行 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
指令的使用。如果你不知道怎么激活虚拟环境的话,回到上一篇教程看看。
python3
而不是 python
来运行这个指令,请根据你自己的情况调整。
正常的话,你能看到你的终端里输出了一大堆东西。先不用管,打开浏览器输入 127.0.0.1:8000,你能看到一个页面:
这是 Django 的初始页面。恭喜你,你已经成功拥有了一个能访问的网站了!
1.2 讲讲 Django 的结构
好,假如说我们现在想写一个 Hello World 的页面,并且想让它作为整个网站的首页,我们要怎么做呢?
我们需要先了解一点 Django 网站的架构,或者说,Django 如何解析请求并返回内容?
这是 Django 的架构示意图。Django 有三个核心的组件:视图(View)、模板(Template)、模型(Model)。
可以看到,我们所有业务的核心都集中在 Django 的视图中。它负责了和用户的交互,同时负责向模板和模型下发指令,从中读取需要的东西,并最终生成需要提供给用户的内容。Django 网站上的所有内容,最终都是通过视图返回给用户的。
所以说,如果我们想要写一个 Hello World,其实只需要写一个这样的视图就行了。我们甚至不需要上模板和模型,我们只需要让视图在任何条件下都返回一个 Hello World 就可以。
在我们的项目里,新建一个文件:views.py
,内容如下:
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello world! ")
在这里,我们定义了一个叫做 hello
的视图,要求它在接收到任何请求的时候都返回一句 Hello world!
然后,我们需要让 Django 知道什么时候调用这个视图,所以我们需要设置 URL。
打开项目里的 urls.py
,你会看到一个初始的 URL 文件。
让我们把文件修改成这样:
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。
1.3 补充:Django 中 URL 和视图之间的关系
很简单,让我们现场修改一下刚刚的 views.py
:
path("hello/", views.hello, name="hello"),
然后,再次访问 127.0.0.1:8000 :
没错,它 404 了,找不到首页了。
而聪明的你估计已经想到它现在在哪了:127.0.0.1:8000/hello
所以,在 Django 中,用户的每一个请求会首先交由 urls.py
进行检查,在其中找到匹配的对象之后,再交由对应的视图来处理。
2 再想想,我们的需求是什么?
接下来,忘掉刚刚我们写的代码,回到一开始——我们需要一个什么东西来着?
我们需要一个可以接收数据,并把数据存储到数据库里的系统。
结合 Django 的结构,你应该已经想到了一个基本的处理思路:新建一个视图,数据可以被上传到这个视图内,再让这个视图将数据转存到模型中。很好!
或许到这里,你可以自由地探索一下,我们要怎么实现这个功能呢?在这个过程中,有几个重要的步骤呢?
- 如何让实验程序发出数据?
- 如何建立并管理 Django 模型?
- Django 视图如何接收实验程序的数据?如何处理这些数据?如何储存这些数据?
下一篇里,我们会来一点点探索如何实现上面的功能,构建一个完整的实验系统。但在这之前,或许你自己的尝试会更重要一些?你可以先结合网上的各种资源和教程,研究一下你分别需要什么,如何把你需要的东西组合在一起。或许这样,你会对整个架构有更深的理解。