Django视图与路由
在介绍Django视图与路由之前,需要了解一个概念:URL
URL
URL 是统一资源定位符(Uniform Resource Locator)的首字母缩写,中文译为“网址”,表示各种资源的互联网地址。
所谓资源,可以简单理解成各种可以通过互联网访问的文件,比如网页、图像、音频、视频、JavaScript 脚本等等。只有知道了它们的 URL,才能在互联网上获取它们。
比如用浏览器随意打开网络上的一张图片,可以发现在浏览器的地址栏,会展示如下方连接类似的内容:
https://pics4.baidu.com/feed/a6efce1b9d16fdfa32fddf98b51e495e95ee7b4a.jpeg?token=834ef0d6a011d27f661a9cee70e6af02
URL格式内容
URL 的语法格式为:
scheme://DomainName[:port]/path[?query][#fragment]
例如下方这个网址
http://www..baidu.com:8080/news/landscape/search?boardID=5&ID=24618&page=1#r_70732412
scheme(协议)
scheme是指网络传输协议,以下是经常用到的几个协议:
- http,通过 HTTP 协议访问该资源,格式
http://
; - https,通过安全的 HTTPS 协议访问该资源, 格式
https://
; - file,资源是本地计算机上的文件,格式
file://
; - ftp,通过 FTP访问资源,格式
FTP://
。
DomainName(域名)
指存放资源的服务器的域名、主机名或 IP 地址。本例的www.godsince.com
则是域名部分
有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。
port(端口号)
端口port跟在域名后面的是端口,域名和端口之间使用 :
作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口。本例的8080
则是端口部分
port 是一个可选的整数,它的取值范围 是 0-65535。各种传输协议都有默认的端口号,如 http 的默认端口为 80,https 的端口是 443。
path(路径)
path值虚拟目录(或称为查询路径),由零个或多个/
符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。从域名后的第一个/
开始到最后一个/
为止,路由地址决定了服务端如何处理这个请求。本例的/news/landscape/
则是path部分
query (查询参数部分)
从?
开始到#
为止,它们之间的部分就是参数,又称搜索部分或者查询字符串。这个部分允许有多个参数,参数与参数之间用&
作为分隔符。本例的参数部分为boardID=5&ID=24618&page=1
。
fragment(锚部分)
或称片段(fragment),它用于指定网络资源中的片断,例如一个网页中有多个名词解释,那么可使用 fragment 直接对它们定位。
本例中的信息片段是#
后的 r_70732412
。#
代表网页中的一个位置而 r_70732412
就是这个位置的标志符号,当浏览器读取到上述 URL 后,浏览器将直接展示该位置。
Django路由系统应用
我们在浏览器中输入百度的网址https://www.baidu.com/
,浏览器就会打开百度的web页面。
用户向 Web 站点发送请求,是通过 URL 实现的,当 Web 服务器端接收到用户请求后,Django又是怎么处理的呢?通过 MTV 的设计模式,我们可以得知,首先用户请求会到达相应的视图函数,视图函数通过Django的“路由系统”机制找到相应的访问资源。
如果在浏览器中输入一个网站,通过Django展示某些信息,要如何实现呢?
例如在浏览器中输入URL:http://127.0.0.1:8000/index/
,在网页上展示Hello Django
视图函数
视图是 MTV 设计模式中的 V 层,它是实现业务逻辑的关键层,可以用来连接 M 层与 T 层,起着纽带般的作用
在 Django 中,视图函数是一个 Python 函数或者类,开发者主要通过编写视图函数来实现业务逻辑。视图函数首先接受来自浏览器或者客户端的请求,并最终返回响应,视图函数返回的响应可以是 HTML 文件,也可以是 HTTP 协议中的 303 重定向
在 demo
应用中的 views.py
中添加以下代码:
from django.shortcuts import render
from django.http import HttpResponse # 导入HttpResponse视图响应类型
# 定义视图函数
def index(request):
return HttpResponse('<html><body><h1>Hello Django</h1></body></html>')
视图函数解析:
- 导入HttpResponse视图响应类型。从
django.http
模块中导入HttpResponse
,HttpResponse
是一种视图的响应类型。 - 视图函数参数。定义了一个名为
index
的函数,Django 规定视图函数至少有一个参数,第一个参数必须是 request,request
是HttpRequest
请求类型的对象,它携带了浏览器的请求信息,所以视图函数的第一个参数必须为request
。 - 返回响应内容。视图函数要返回响应内容,这里的响应内容是
Hello Django
为名的一级标题,把它作为 HttpResponse 的对象返回给浏览器。
路由配置
Django 中利用 ROOT_URLCONF
构建了 URL 与视图函数的映射关系,也就是 Django 项目目录中的 urls.py,该文件是创建项目后自动生成的路由配置文件,urls.py 文件中定义了一个 urlpatterns 的列表,它是由 url( ) 实例对象
组成的列表,Django 中 url 的定义就是在这个列表完成的。
路由的语法格式:
path(route,view,name=None)
path 的参数解析:
- route,匹配请求路径,用正则表达式表示;
- view,指定 route 匹配路径所对应的视图函数的名称;
- name,是给 url 地址起个别名,在模板反向解析的时候使用
在项目目录下的urls.py
文件中添加以下代码:
from django.contrib import admin
from django.urls import path
from demo import views # 导入demo应用中的视图
from test import views as test_view
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index), # 将视图函数添加入路由配置中
path('home/',test_view.index)
]
路由配置解析:
- 与视图层进行绑定。导包操作,在项目目录下的
urls.py
文件中导入demo
应用中的views.py
。如果需要从多个应用中导入视图,会出现重名冲突,可采用as
赋予别名 - 定义路径地址。路径地址被定义为
index/
,也就是在本机浏览器地址栏输入:http://127.0.0.1:8000/index/
,进行访问,views.index
将index/
路径与views.py
中的index
视图函数进行了关联
路由是视图的向导。在浏览器中输入地址,Django 收到请求以后,首先创建一个带有请求信息的 HttpRequset 对象
,将 HttpRequest 的对象 request 作为第一个参数传递给视图函数,视图接收参数后继续向下执行后加载路由配置,然后选择加载对应的视图,最后返回 HttpResponse 对象给浏览器。
在项目运行后,通过访问对应的地址就可以得到相应的页面了,在浏览器中输入地址http://127.0.0.1:8000/index/
,页面上就会展示Hello Django
【拓展】:在浏览器中输入http://127.0.0.1:8000/index
,浏览器会默认在 index
后加上 /
。若path中定义的路径没有加上/
,而是path('index',views.index)
,使用浏览器访问http://127.0.0.1:8000/index
,就会访问失败