Django讲课笔记07:设置路由分发规则
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django讲课笔记07:设置路由分发规则相关的知识,希望对你有一定的参考价值。
文章目录
零、本讲学习目标
- 学会配置路由
- 学会路由分发规则及配置
- 编写简单的视图函数
一、课程导入
(一)复习
- 创建项目(django-admin startproject XXX)
- 创建应用(python manage.py startapp XXX)
- 配置应用、模板、数据库、静态资源、媒体资源
- 内置指令(30个,必须了解每个指令的具体作用)
(二)路由
路由
称为URL
(Uniform Resource Locator
- 统一资源定位符),也可以称为URLconf
, 是对可以从互联网上得到的资源位置和访问方法的一种简洁表示,是互联网上标准资源的地址。互联网上每个文件都有一个唯一的路由,用于指出网站文件的路径位置。简单地说,路由
可视为我们常说的网址
,每个网址代表不同的网页。
二、新课讲授
(一)设置路由分发规则
一个完整的路由包含:路由地址
、视图函数(或者视图类)
、路由变量
和路由命名
。其中基本的信息必须有:路由地址
和视图函数(或者视图类)
,路由地址即我们常说的网址;视图函数(或者视图类)即项目应用(App)的views.py
文件所定义的函数或类;路由变量和路由命名是路由的变量和命名设置,使路由具有动态变化
和命名引用
功能。(动态变化
是指一个路由地址按照某个规律
演变多种不同的路由地址:命名引用
是指在视图
、模型
等其他项目文件使用路由命名生成相应的路由地址)
在默认情况下,设置路由地址是在项目同名的文件夹的urls.py
文件里实现,这也是由配置文件settings.py
的ROOT_URLCONF
决定,以项目babies
为例,配置属性ROOT_URLCONF
指向babies文件夹的urls.py,如下图所示:
一个项目中可能设有多个项目应用(App),而babies文件夹的urls.py是定义项目所有路由地址的总入口,如果项目中所有路由地址都在babies文件夹的urls.py中定义,当项目功能规模越来越大的时候,babies文件夹的urls.py定义的路由地址就会越来越多,从而造成难以管理的问题。
为了更好区分各个项目应用(App)的路由地址,我们在babies文件夹的urls.py中分别为每个项目应用(App)定义一条路由入口。首先在每个项目应用(App)的文件夹里创建urls.py文件,然后将新建的urls.py添加到babies文件夹的urls.py,添加方法由Django内置函数path
和include
实现。
1、创建应用的路由文件(子路由) - urls.py
每个应用(App)均创建一个路由文件urls.py,目前没有什么具体内容,只写一条语句,定义一个空列表urlpatterns
:
urlpatterns = [
]
(1)创建index应用的路由文件
(2)创建commodity应用的路由文件
(3)创建shopper应用的路由文件
2、配置项目的路由文件(主路由) - urls.py
(1)定义项目的路由集合
- 使项目的urls.py的urlpatterns指向每个应用的urls.py,具体配置如下:
(2)主路由文件代码说明
babies文件夹的urls.py定义了5条路由信息,分别是Admin站点管理、首页地址(项目应用index的urls.py) 、商品信息(项目应用commodity的urls.py) 、购物车信息(项目应用shopper的urs.py)和媒体资料。其中, Admin站点管理在创建项目时己自动生成,一般情况下无须更改。整个babies文件夹的urls.py的代码说明如下:
from django.contrib import admin
:导入内置Admin功能模块。from django.urls import path,include
:导入Django的路由函数模块。urlpatterns
:代表整个项目的路由集合
,以列表格式表示,每个元素代表一条路由信息。path('admin/', 'admin.site.urls')
:设定Admin管理系统的路由信息。'admin/'代表127.0.0.1:8000/admin的路由地址,admin后面的斜杠是路径分隔符,其作用等同于计算机中文件目录的斜杠符号;admin.site.urls
指向内置Admin功能所自定义的路由信息,可以在Python目录Lib\\site-packages\\django\\contrib\\admin\\sites.py
中找到具体的定义过程。
path('', include(('index.urls', 'index'), namespace='index'))
:路由地址为"/"
,即127.0.0.1:8000
,通常是网站的首页;路由函数include是将该路由地址分发给项目应用index的urls.py处理。(说明:include((pattern_list,app_namespace),namespace=None) app_namespace:应用命名空间;namespace:实例命名空间)path('commodity', include(('commodity.urls', 'commodity'), namespace='commodity'))
:路由地址为"/commodity"
,即127.0.0.1:8000/commodity
,这是商品详细和商品列表页面;路由函数include是将该路由地址分发给项目应用commodity的urls.py处理。path('shopper', include(('shopper.urls', 'shopper'), namespace='shopper'))
:路由地址为"/shopper"
,即127.0.0.1:8000/shopper
,这是购物车、个人中心、用户注册等页面;路由函数include是将该路由地址分发给项目应用shopper的urls.py处理。re_path('media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}, name='media')
:路由地址为"/media/xxx"
,即127.0.0.1:8000/media/xxx
,这是媒体定义的路由地址,路由函数re_path表示允许在路由地址里面设置正则表达式。
3、路由设计模式的工作原理
从babies文件夹的urls.py定义的路由信息得知,每个项目应用(App)的路由地址交给项目应用的urls.py自行管理,这是路由的分发规则
,使路由按照一定的规则进行分类管理。整个路由设计模式的工作原理说明如下:
- 当运行babies项目时, Django从babies文件夹的urls.py找到各个项目应用(App)的urls.py,然后读取每个项目应用(App)的urls.py定义的路由信息,从而生成完整的路由列表。
- 用户在浏览器上访问某个路由地址时,Django就会收到该用户的请求信息。
- Django从当前请求信息中获取路由地址,并在路由列表里匹配相应的路由信息,再执行路由信息所指向的视图函数(或视图类),从而完成整个请求响应过程。
三、课堂小结
四、课后作业
五、拓展内容
以上是关于Django讲课笔记07:设置路由分发规则的主要内容,如果未能解决你的问题,请参考以下文章
Django讲课笔记10:使用QuerySet删除和查询单表