HTTP请求的url路由

点击这里,边看视频讲解,边学习以下内容

我们的Django 教程 以一个实际的案例 来 讲解如何使用Django 开发Web应用。

我们的案例是 实现一个 公司 的 销售管理系统。

具体的系统需求 请点击这里

在实现的过程中,我们将会了解 Django web 开发中的如下重要概念

url路由
http请求处理
ORM数据库操作


创建项目app

Django 中的一个app 就是项目里面的一个应用的意思。

一个项目包含多个app。

一个app 通常就是一个相对独立的模块 ,实现相对独立的功能。

比如,我们可以把 这个系统的 管理员管理的功能 做在一个名字为 mgr的app里面,把 销售人员的操作 实现在另外一个名字为 sales的app里面。

一个app 本质上 就是一个 Python 包, 里面包含了一些应用相关的代码文件。

当然,一个项目分成多少个app 这完全取决你的设计。 你把所有的功能都放入一个大app内也可以实现功能,只是这样做,这个app特别的臃肿。



Django 中创建app 可以 通过执行命令,创建一个app目录,并在里面自动创建app常用的文件。

比如,现在我们需要一个app 专门处理 白月医药系统中销售员的 添加、修改、查询、删除请求。

我们就进入项目根目录,执行下面的命令。

python manage.py startapp sales 

这样就会创建一个目录名为 sales, 对应 一个名为 sales 的app,里面包含了如下自动生成的文件。

sales/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

这个目录其实就是一个python package

里面有很多文件,后面我们会分别讲到它们的作用。


返回 页面内容 给浏览器

当浏览器地址栏中输入网址访问的时候,服务端是如何让浏览器呈现出网页内容的?

是这样的: 当我们输入网址,比如百度网址,比较敲回车后, 浏览器会发出http请求给百度的服务器,百度服务器返回 HTML 文档内容给浏览器, 浏览器解析后,呈现出我们最终看到的网页内容。

服务器返回的 HTML 文档内容其实就是 符合 HTML 语法的 一段字符串 而已。

我们现在使用Django 开发后端服务, 就可以响应 浏览器的http请求, 返回一段HTML字符串, 浏览器就可以呈现在界面上了。

刚才我们创建的 sales 应用里面 有个 views.py 文件。 这个文件里面通常是写处理http 请求的代码的。

比如,我们 设计 凡是浏览器访问的http 请求的 url 地址 是 /sales/orders/ , 就由 views.py 里面的函数 listorders 来处理, 返回一段字符串给浏览器。

请大家 打开 views.py , 在里面加入如下内容

from django.http import HttpResponse

def listorders(request):
    return HttpResponse("下面是系统中所有的订单信息。。。")

注意

  • 这里面最终的返回结果是 HttpResponse 对象的参数字符串 ,也就是这句话

    下面是系统中所有的订单信息。。。

  • listorders的参数request是Django中的 HttpQuest对象,包含了请求中的信息。

    它的用法后面会讲。这里暂时用不到该参数。


光是定义了这样一个函数不行的,我们需要 告诉 Django

当前端发送过来的HTTP请求 url地址 是 /sales/orders/ , 就由 views.py 里面的函数 listorders 来处理

怎么告诉Django呢?

这就是 Django中的 url路由设置。


url路由

添加路由记录

前面在创建项目目录的时候,在项目的设置目录下,有如下的一个urls.py 文件

白月黑羽Python3教程

这个文件是 url路由设置的入口文件。

打开该文件,在 urlpatterns 列表变量中添加一条路由信息,结果如下

from django.contrib import admin
from django.urls import path

# 别忘了导入 listorders 函数
from sales.views import listorders

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

    # 添加如下的路由记录
    path('sales/orders/', listorders),
]

urlpatterns 列表 就是 Django 的 url 路由的入口。

里面是一条条的路由记录,我们添加的

path('sales/orders/', listorders)

就是告诉 当前端过来的请求 url地址 是 /sales/orders/ , 就由 views.py 里面的函数 listorders 来处理

通常我们项目代码的修改, Django的测试服务可以自动检测到,并且重新加载,不需要我们重启 Django Web 服务。

如果大家想重新启动 Django web 服务, 大家可以在启动web服务的命令行窗口,按ctrl + break(也就是Pause按钮)先停止服务。 然后再次运行启动命令。

我们这时,就可以登录浏览器输入网址 http://127.0.0.1/sales/orders/

回车后,就会出现如下内容

白月黑羽Python3教程

这就是浏览器的请求经过 Django路由后, 选择执行我们定义的函数 listorders,该函数 返回的字符串, 被作为http响应的消息体中的内容返回给 浏览器了。

所以浏览器最终显示的就是 我们 listorders 函数返回的字符串。


路由子表


点击这里,边看视频讲解,边学习以下内容

url 路由表就是可以像上面这样,一个请求对应一个处理函数。

但是有的时候,我们的项目比较大的时候, 请求的url 会特别多。

比如我们的系统提供给 客户、销售商、管理员 访问的url是不一样的,如下

customer/
customer/orders/      

sales/
sales/orders/  

mgr/
mgr/customers/
mgr/medicines/
mgr/orders/

复杂的系统url条目多达几百甚至上千个, 放在一个表中,查看时,要找一条路由记录就非常麻烦。

这时,我们通常可以将不同的路由记录 按照功能 分拆到不同的 url路由子表 文件中。

比如,这里我们可以把 访问 的 url 凡是 以 sales 开头的全部都 由 sales app目录下面的 子路由文件 urls.py 处理。

首先我们需要在 sales 目录下面创建一个新的文件 sales\urls.py

然后在这个 sales\urls.py 文件中输入如下内容

from django.urls import path

from . import views

urlpatterns = [
    path('orders/', views.listorders),
]

然后,我们再修改主url路由文件 bysms/urls.py , 如下

from django.contrib import admin

# 导入一个include函数
from django.urls import path, include

from sales.views import listorders
urlpatterns = [
    path('admin/', admin.site.urls),

    # 凡是 url 以 sales/  开头的,
    # 都根据 sales.urls 里面的 子路由表进行路由
    path('sales/', include('sales.urls')),

]

当一个http请求过来时, Django检查 url,比如这里是sales/orders/

先到主url路由文件 bysms/urls.py中查看 是否有匹配的路由项。

如果有匹配 ( 这里匹配了 sales/ ), 并且匹配的对象 不是 函数, 而是 一个子路由设置 , 比如这里是 include('sales.urls')

就会去子路由文件中查看, 这里就是 sales.urls 对应的文件 sales\urls.py

注意这时,会从请求url中去掉 前面主路由文件 已经匹配上的部分(这里是 sales/ ), 将剩余的部分 (这里是 orders/ )去子路由文件中查看是否有匹配的路由项。

这里就匹配了 orders/ ,匹配的对象,这里是 views.listorders ,它是一个处理函数,就调用该函数处理 这个http请求, 将该函数的返回对象 构建 HTTP响应消息,返回给客户端。


目前为止,我们项目代码,点击这里下载


作业和练习

根据教程教程,仔细体会 Django 中 URL 路由的概念。

上次练习,我们安装好了 Django ,并且创建项目。

在上次项目目录的基础上,添加如下2条路由:

mgr/orders/
mgr/medicines/

分别对应 获取系统所有 订单 和所有的 药品。

并且自己写代码,处理这两种路由的HTTP请求消息。

写好后,启动web服务。在浏览器访问上面的两条路由,检查 返回到浏览器中的信息是否正确。


扫码分享给朋友,一起学更有动力哦



上一页 下一页