<学习笔记>从零开始自学Python-之-web应用框架Django(二)视图和URL配置

在上面的helloworld例子中,我们已经用到了视图和URL配置的概念,现在我们详细说说。

1、Django视图

上一篇文章里面我们说了,Django的视图相当于一个函数,是负责实现业务逻辑的。

比如helloworld 例子中,我们写了hello这个视图函数,

from django.http import HttpResponse
def hello(request):
    return HttpResponse("Hello world")

这个函数的功能就是返回使用文本 "Hello world" 实例化的 HttpResponse 对象。

如果调用了这个函数,实现的效果就是在相应的页面上显示 “Hello world”

这里要注意,视图函数至少有一个参数,按约定,名为 request。这是一个对象,包含触发这个视图的 Web 请求的信息,是 django.http.HttpRequest 类的实例。

2、URL 配置

那么怎么调用视图函数并在相应页面显示文本呢,这里就要涉及到URL 配置。

URL配置就是为了把视图函数与特定的 URL 对应起来,即把 URL 映射到相应的视图函数上。

URL配置一般放在urls.py模块中。

from django.contrib import admin
from django.urls import path
from newweb.views import *

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

分析一下这段代码:

• 第一行从 django.contrib 模块中导入 admin 函数。这个函数负责加载 Django 管理后台 的 URL。

• 第二行从django.urls 模块中导入 path 函数,这个函数负责管理URL地址。

• 第三行是从newweb.views 模块中导入我们写的所有视图函数

然后下面的urlpatterns 变量,就是地址列表,每个地址都用一个path函数来进行映射,path函数的第一个参数是访问地址,比如'hello/'就表示访问主页+'hello/'这个地址,在我们这个例子中就表示访问“http://127.0.0.1:8000/hello/”,而省略不写就表示访问主页,即 “http://127.0.0.1:8000/”。path函数的第二个参数是视图函数,比如 hello 就表示调用 views模块的 hello 函数,那么根据上面hello函数的功能,就会显示一个包含文本“Hello world”的页面。

如果不同的url使用同样的视图函数,那么最后显示的效果是一样的,在上例中,我们访问 “http://127.0.0.1:8000/hello/” 和  “http://127.0.0.1:8000/”得到的是同样的结果。

3、Django 处理请求的过程

我们在 Web 浏览器中访问 http://127.0.0.1:8000/hello/,看到“Hello world”消息,在这个过程中 Django 在背后做了什么呢?

一切都从 设置文件开始。 运行 python manage.py runserver 命令时,manage.py 脚本在内层 newweb 目录中寻找名为 settings.py 的文 件。这个文件中保存着当前 Django 项目的全部配置,各个配置的名称都是大写的,例如 TEMPLATE_DIRS、 DATABASES,等等。其中最重要的设置是 ROOT_URLCONF。它告诉 Django,网站的 URL 配置在哪个 Python 模块 中。

打开setting.py文件,可以看到:

ROOT_URLCONF = 'newweb.urls'

这个模块对应的文件是 newweb/urls.py。收到针对某个 URL(假如是 /hello/)的请求时,Django 加载 ROOT_URLCONF 设置指定的 URL 配置;然后按顺序检查 URL 配置中的各个 URL 模式,依次与请求的 URL 比 较,直到找到匹配的模式为止。

找到匹配的模式之后,调用对应的视图函数,并把一个 HttpRequest 对象作为第一个参数传给视图。如我们编写的第一个视图所示,视图函数必须返回一个 HttpResponse 对象。 随后,余下的工作交给 Django 处理:把那个 Python 对象转换成正确的 Web 响应,并且提供合适的 HTTP 首 部和主体(即网页的内容)。

综上:

a. 请求 /hello/。

b. Django 查看 ROOT_URLCONF 设置,找到根 URL 配置。

c. Django 比较 URL 配置中的各个 URL 模式,找到与 /hello/ 匹配的那个。

d. 如果找到匹配的模式,调用对应的视图函数。

e. 视图函数返回一个 HttpResponse 对象。

f. Django 把 HttpResponse 对象转换成正确的 HTTP 响应,得到网页。

这就是上一篇我们用Django实现Hello World 的原理。

4、动态网页

前面我们访问的 http://127.0.0.1:8000/hello/ 是个静态网页,如果我们想要访问动态网页怎么办呢

比如我们想在网页中显示当前的日期和时间。

这里要用到一个Python的模块datetime,然后我们在views里面新写一个视图函数now

from django.http import HttpResponse
import datetime

def now(request):
    now=datetime.datetime.now()
    show="你好,现在的时间是{}".format(now)
    return HttpResponse(show)

这里用 datetime.datetime.now() 这个函数获取到当前时间,再把它赋值给变量now

然后拼接一下提示文字,再赋值给变量show

最后返回文本为 变量show 的HttpResponse实体页面

我们再在urls.py中配置一下地址

from django.contrib import admin
from django.urls import path
from newweb.views import *

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

把空地址的那个path的第二个参数改成now,这样访问根地址“http://127.0.0.1/”的时候就会调用now函数,从而显示当前时间,效果如下:

 5、动态URL

页面的内容(当前日期和时间)是动态的,但 URL 是静态的(/time/)。可 是,在多数动态 Web 应用中,URL 中会包含参数,影响页面的输出。

比如说我们现在有个班级有 {1:'郭靖',2:'杨过',3:'王语嫣',4:'赵敏'}四名同学,我们希望用一个视图函数通过在网址中加入不同的数字来实现访问不同的同学。

我们还是先把这个视图函数写好

def student(request,id):
    students={1:'郭靖',2:'杨过',3:'王语嫣',4:'赵敏'}
    s=students[id]+" 同学"
    return HttpResponse(s)

注意,和之前不同,我们在视图函数student后多加了一个参数id,这个参数是动态赋值的。

我们编写一个字典,把数字和各位同学的映射关系做好,然后用不同的id值在字典中取不同的值并赋值给变量s,最后在返回包含文本s的页面。

相应地,我们要配置urls.py

from django.contrib import admin
from django.urls import path
from newweb.views import *

urlpatterns = [
    path('',now),
    path('admin/', admin.site.urls),
    path('hello/',hello),
    path('student/<int:id>/',student),
]

我们新加了一个path函数,这里的第一个参数写成 “student/<int:id>”  前面的student/ 还是正常的地址,后面接的 <int:id> 表示一个变量,并指明了变量类型为 int 名称为 id ,第二个参数表示调用student视图函数。

这样我们访问的时候加上想要的数字,就可以得到想看到的同学了,

比如 访问 http://127.0.0.1:8000/student/2/ 就能看到杨过同学,

  访问 http://127.0.0.1:8000/student/3/ 就能看到王语嫣同学,

那么可不可以不用数字,而用字符串呢?当然可以

我们把同学分成两组,男同学一组,女同学一组{‘male’:'郭靖  杨过','female':'王语嫣  赵敏'}

然后重写一个student2视图函数

def student2(request,sex):
    students={'male':'郭靖  杨过','female':'王语嫣  赵敏'}
    s=sex+":"+students[sex]
    return HttpResponse(s)

再配置一下URL:

from django.contrib import admin
from django.urls import path
from newweb.views import *

urlpatterns = [
    path('',now),
    path('admin/', admin.site.urls),
    path('hello/',hello),
    path('student/<int:id>/',student),
    path('student/<str:sex>/',student2),
]

这时候访问  http://127.0.0.1:8000/student/female/ 就能看到女同学了 

6、错误页面404

如果访问一个没有在urls.py中配置的页面,就会出现404报错页面,比如我们现在访问

  http://127.0.0.1:8000/teacher ,因为我们没有配置过 这个地址,所以会出现404报错页面

这个页面除了显示 404 错误消息之外,还给出了其他信息。它会告诉你 Django 使用的是哪个 URL 配置,以 及那个配置里的各个模式。根据这些信息你应该能判断为什么所请求的 URL 会返回 404 错误。 显然,这些是敏感信息,只供 Web 开发者查看。线上网站不应该公开显示这些信息。鉴于此,“Page not found”页面仅当 Django 项目处于调试模式时才会显示。

创建 Django 项目后,它就处于调试模式。如果不在调试模式中,Django 会输出其他的 404 响应。后面会介绍如何解除调试模式,以及在正式模式中如何设置相应的404页面。

猜你喜欢

转载自blog.csdn.net/qq_41597915/article/details/126092519