1、Python Web开发基础教程(Django版)第3章URL分发本章主要内容:URL配置 URL参数传递 反向解析URL URL命名空间3.1 URL分发机制简介,URL的基本格式为“协议:/域名或IP地址/路径/文件名”。,域名或IP地址在Web服务器中分配给Web站点。路径是网络资源在Web服务器中的逻辑路径。文件名通常与网络资源的物理文件名一致。例如,http:/ 9 6o5/page.htm。其中:http是访问WWW服务的常用“是域名“85/15/c2647a99605是文件“page.htm在Web服务器中的路径。Django提供了灵活的URL分发机制,允许用户使用任意格式的 U
2、RL“路径/文件名”部分。Django接收到请求的URL时,开始执行URL分发,按顺序执行下列操作。(1)启用根URL配置模块。根URL配置模块由项目配置文件settings.py中的ROOTJJRLCONF变量设置。例如,ROOT.URLCONF=HelioWorld.urlso,(2)加载根URL配置模块,并查找变量urlpatterns。urlpattems是一个URL模式列表,每个列表项是一个 django.urls.path。或django.urls.re_ path()实利,示例代码如下。urlpatterns=pathC/View s.hello,name=hello,)/re_
3、 path(r,Ad2,$/useRe_ View.NumberlnUrl)/(3)按顺序遍历每个URL模式,在找到与请求的URL相匹配的第一个模式时停止。(4)Django调用匹配的URL模式所映射的视图函数,将函数返回值作为响应结果返回给用户。视图函数接收下列 参薮:一个HttpRequest对象实例:它封装了客户端请求的相关信息。URL参数:如果匹配的URL模式中嵌套了变量,则将URL路径中的匹配内容赋值给变量,将其作为参数传递给视图函数。-kw args参数:向视图函数传递其他参数值。(5)如果没有找到匹配的URL模式,或者此过程中的任何位置引发错误,Django将调用错误处理视图。默
4、认情况下,Django会为项目创建一个urls.py文件,将其作为URL配 置模块,也称为根URL配置模块。Django 将 URL 配置称为 URLconf。通常情况下,项目的URL配置模块放在与项目同名的子文件夹中。例如,在myDjango项目中,“myDjangomyDjangourls.py为项目 URL配置模块。项目应用也可以使用自己的URL配置模块。Djangofirsturls.py为项目应用first的URL配置模块。名按惯例使用urls.py,也可以使用其他的文件名。例如,myDjango URL配置模矶的文件牌置爵激蹄髓疆熊首先加载根皿配置模块,中,通过URL配置包含应用的
5、URL配置模块。Django般在根URL康URL配置模块是必需的,应用的URL配置模块则是可选的。在执彳亍python manage.Django默认在根URL酉竟 admin.site.urls)。”命令创建项目时,pathCadmin/1,通过“admin”路彳工,admin.site.urls是Django提供的管理站点项目的URL配置模块。通过“admin”路在,莱质问Django管理站点。云节将春8.1节 中媒解使出Dj a n g o管理站点南万溪。3.2 URLS 1 URL配置指使用URL解析函数建立URL模式与视图函 数之间的映射关系,也就是设置访问视图函数的URL 规则。本
6、节主要内容,URL解析函数,使用正则表达式包含其他的URL配置3.2.1 URL解析函数URL配置文件中的urlpatterns变量为URL解析函数的实 例列表。Django提供两个URL解析函数:django.urls.path()ndjango.urls.re_ path()o 另夕卜,django.conf.urls.url()django.urls.re_ path()的 别名,并有可能在未来被弃用,应慎用 HelloWorld项目中的urls.py文件代码。from django.contrib import admin from django.urls import path fr
7、om.import views urlpatterns=pathCviews.hello,name=hello,)/pathCadmin/1,admin.site.urls),其中:“from django.contrib import admin导入Django的默认管理站点admin。“from django.urls import path”导入URL解析函数path。“from.import views”导入当前目录中的视图模块views(对应views.py文件)。Urlpatterns变量包含了两个URL映射。path(/view s.hello/name=,hello7):第一个
8、参数为空字符串,用于匹配只使用域名或IP地址的URL,如“327.o.o.i:8ooo。第二个参数“view s.hello设置了URL匹配时调用的视图函数。第三个参数“namehelky将URL模式的名称设置为“hello。pathCadmin/,admin.site.urls):,第一个参数为“匕dmin/,用于匹配“域名或IP地址/admin/格式的 URL,如“i27.o.o.i:8ooo/admin/。path()和re_path()函数的原型如下。path(route,view,kwargs=Nonez name=None)re_path(routez view,kwargs=No
9、nez name=None)访问Django站点的URL基本格式为“协议:/域名或IP地址/路径”。参数route为URL模式,用于匹配请求的URL中的“路径”。参数view用于设置路径匹配时调用的视图函数。可选参数kwargs用于设置传递给视图函数的附加数据。可选参数name为URL模式命名。在URL反向解析时用URL模式的名称可获得访问视图函数的URL。ath()函数的第一个参数route都是字符串,re_path()函数将route参3.2.2使用正则表达式正则表达式提供了一种灵活的字符串匹配方式。re_path()函数使用正则表达式定义 URL模式。下表列出了常用的正则表达式符号。符号
10、说明示例示例说明1匹配其中一个选项ab|cd匹配ab或cdA匹配字符串起始部分Adj匹配任何以dj开始的字符串$匹配字符串末尾部url$|匹配任何以url结束的字符串*匹配零次或者多次出现的左端0-9*匹配以任意数字开始的字符串_+匹配一次或者多次出现的左端0-9+匹配以一个或者多个数字字符串?匹配零次或者一次出现的左端0-9?匹配零个或者一个数字_N匹配 N 次0-9 H5匹配5位数字字MfN匹配M次到N次左端o-9 275匹配25位数字字符串匹配括号中的任才abed匹配a或者b或者c或者d-匹配指定范围中的一个字符a-f匹配a到f之间的任意一个字符A不匹配指定的任何一个字符Aabc匹配不是
11、a或b或c的任意字符常用的正则表达式正贝!八o9】*$Ndn$Ndn,$Ndm,n$数字n位的数字 至少n位的数字 m-n位的数字八(0|*9。-9*)$八(1-9。-9*)+(-1:。-9,2)?$N)?d+(.d2,5)?$八(小+)?d+(.d+)?$八。-9+(。-9儿5)?$八。-9+(。-91,3)?$Ai-9d*$或 八+?1-9。-9】*$八卬9】口o-9*$或八i-9d*$Zu4eoo-u9fa5o,$八,5.3。$NAZaz+$NA-Z+$Na-z+$AA-Za-zo-91+$aw+(+.w+)*w+(w+)*.w+(.w+)*$八由15|由18$零和非零开头的数字非零开头
12、的最多带两位小数的数字带25位小数的正数或负数正数、负数、小数有两位小数的正实数有13位小数的正实数非零的正整数非零的负整数汉字长度为53。的所有字符由大小写英文字母组成的字符串由大写英文字母组成的字符串 由小写英文字母组成的字符串 由数字和大小写英文字母组成的字符串 E-mail地址身份证号(25位、工8位数字)实例,创建一个项目ch叩te3和应用useRe,在应用中定义视 图函数,视图函数根据请求的URL不同输出相应的信 息。具体操作步骤如下。演示3.2.3包含其他的URLS!置1.包含其他文件中的URL配置实例:为项目ch叩te3添加一个应用testinclude,为应用创建一个 url
13、s.py文件以配置URL访问应用的视图函数,并在项目 ch叩ter3的URL配置中包含应用的URL配置。,具体操作步骤如下。演示,2.包含path。实例列表,在前面的例子中,pathCroot/1,indude(testinclude.urls)包含了 testinclude 应用 的 urls.py+的 URL 配置。可以在项目的URL配置文件中,定义path()实例列表 来包含testinclude应用的urls.py中的URL配置。例如,可将项目的URL配置文件修改为如下代码。#chapter3chapter3urls.py from testinclude import views a
14、s subViews sub=path(lsub2/subViews.useinclude)/urlpatterns=path(root2/z include(sub),#包含应用testinclude的URL配置 也可直接在include。参数中提供path()实例列表,示例代码如下。path(,root2/include(path(lsub2/,/subViews.useinclude),)#包含应用testinclude的URL配置3.3 URL参数传递 Django在执行URL解析时,可将URL路径的一部分解 析为数据,将其作为参数传递给视图函数本节主要内容,获取URL中的数据路径转换
15、器,正则表达式中的变量,传递附加数据使用带默认值的参数3.3.1获取URL中的数据使用path。函数解析URL时,可在URL模式中使用“来捕获URL路径中的数据,示例代码如下。path(test/。view s.getData)Django在解析URL时,会将路径/test/XXX/中的“XXX 作为值传递给变量urlData。,同时,应为getData。函数定义一个名为urlData参数。实例在项目视图文件“chapter3chapter3view s.py”中添 加一个视图函数,将从URL中获取的数据输出到响应 页面。具体操作步骤:,演示默认情况下,Django将URL路径中获取的数据解析
16、为字符串。可以使用下面的路径转换器来完成特定类型的转换。-str:匹配除了路径分隔符(/)之外的非空字符串。在未指定转换器 时,默认使用str。获取的数据为字符串。int:匹配。及正整数。获取的数据为int类型。-slug:匹配字母、数字以及横杠、下划线组成的字符串。获取的数据 为字符串。uuid:匹配格式化的UUID,如。75工9 4dS-GgSszqe-a8a8-6C9 3工e272fo0。获取的数据为UUID实例。path:匹配任何非空字符串,包含了路径分隔符(/)。获取的数据 为字符串。实例,在项目视图文件(叩103小叩103仙0/75个丫”中添力口 视图函数,使用各种路径转换器。,具
17、体操作步骤:演示3.3.3正则表达式中的变量在path。函数中,可在URL模式中使用“变量名”来捕 获URL路径中的数据。在使用正则表达式时,可嵌套”(?P变量名正则表达式)”来获取URL路径中的数据。实例:“项目视图文件“chapter3chapter3view s.py”中添加视图函数,在正则表达式中嵌套变量获取URL中的数据,将其输出到页面。具体操作步骤:演示3.3.4传递附加数据可在path()和re_ path()的第3个参数中为视图函数传递 附加数据。实例:,在项目视图文件“chapter3chapte3view s.py”添加视图函 数,为视图函数传递附加数据。,具体操作步骤:演
18、示3.3.5使用带默认值的参数 可在视图函数中定义带有默认值的参数。要调用带默认值参数的视图函数,可在URL模式中定义 带参数和不带参数的两种URL模式来映射视图函数。当访问不带参数的URL时,即可使用参数的默认值。实例:在项目视图文件“chapter3chapter3view s.py添力口视图函数,在 视图函数中使用带默认值的参数。,具体操作步骤:演示3.4反向解析URL 反向解析URL指通过URL模式的名称或视图函数名称,来 获得访问视图函数的URL。django.urlsieverseO函数用于反向解析URL 本节主要内容反向解析不带参数的命名URL模式反向解析带参数的命名URL模式,
19、反向解析视图函数,在模板中反向解析URL3.4.1反向解析不带参数的命名URL模式当命名URL模式不带参数时,可用reversedURL模式 名称”)语句来获得URL。实例:,在项目视图文件“chapter3chapte3view s.py”添加视图函 数,在页面中输出浏览器请求的URL路径。,具体操作步骤:演示3.4.2反向解析带参数的命名URL模式,如果URL模式使用了参数,在使用reverse。执行反向解析 时,则可能用命名参数args或者kw args设亶反向解析参 破,基本格式如下。reverse(”URL模式名称/args=参数列表)reverse(”URL模式名称,kw args
20、=参数字典)实例:,在项目视图文件(叩103(叩16330/75个丫,添力口视图函数,反 向解析带参数的URL模式。,具体操作步骤:演示3.4.3反向解析视图函数,可使用视图函数名称作为reverse。函数参数来执行反 向解析,这与反向解析命名URL模式类似。实例:,在项目视图文件“chapter3chapte3view s.py”添加视图函 数,使用视图函数名反向解析URL模式。,具体操作步骤:演示3.4.4在模板中反向解析URL在模板中也可使用反向解析来获得访问视图函数的 URL,基本格式如下。1%url URL模式名称参数%有多个参数时,参数之间用空格分隔。实例:在项目视图文件“chap
21、ter3chapter3view s.py添力口视图函数,在模板中使用反向解析获得访问视图函数的URL。,具体操作步骤:演示3.5 URL命名空间本节主要内容URL命名空间简介使用URL的应用命名空间使用U RL的实例命名空间3.5.1 URL命名空间简介 URL命名空间与变量作用范围类似,它是命名URL模式的使用范围。设 置了URL命名空间后,需按照“URL命名空间名称:URL模式名称”的格式来引 用URL模式,例如“namelndex:Default”。在反向解析URL时,Django在指定的URL命名空间中搜索URL模式名称。在不同的命名空间中,可使用相同的URL模式名称。正确使用URL
22、命名空间,可对项目中的应用进行多次部署,即可通过不同的 URL访问同一个应用,示例代码如下。path(lusenamei/,/include(,useNameSpace.urlsl/,lnsi)/namespace=namelndexll)/path(lusename2/,/include(luseNameSpace.urls,/llns2,l)/namespace=namelndex2,l)/Django将URL命名空间分为应用命名空间和实例命名空间。应用命名空间指正在部署的应用的URL命名空间名称。一个应用的多个实例可共享同一个应用命名空间,也可配置多个应 用余名空荷。榭如,前面例子中“n
23、si和“ns2是应用命名空间名称。实例命名空间是应用特定实例的URL命名空间。实例命名空间名称在整个项目中必须唯一。实例命名空间名称可以与应用命名空间名称相同一Django将其视为 应用的默认实例。例如,默认的Django管理站点实例的实例命名空间名称为“admin。3.5.2使用URL的应用命名空间 URL的应用命名空间可用两种方法来定义:在应用的urls.py中 使用叩p_ name定义或者在include。卤数币定义。在应用的urls.py中使用叩p_ name定义应用命名空间的基本格式 如下。app_ name=usename“使用叩p_ name定义的应用命名空间由应用的所有实例共享
24、。在include。函数中定义应用命名空间的基本格式如下。include(pattern_ list,app_ namespace),namespace=None)其中,patternist是URL模式列表,sipp_ namespace设置应用命 名空间名祢,namespace设置实例命名空间。3.5.3使用URL的实例命名空间 URL的实例命名空间在include。函数中进行定义,基本格式如下。include(module,namespace=None)#格式 1 include(module,app_ namespace),namespace=None)#格式2,其中,namespace
25、参数用于定义URL的实例命名空间。Django要求在定义实例命名空间时,必须定义应用命名空间。使用格式1时,必须在参数module指定的urls.py中用叩p_ name 定义应用命名空间,否则会出错。一 使用格式2时,在include。函数的第一个二元参数组的第二个选 项中指定实彳列命名空间名称(app_ namespace)实例,在ch叩te3项目中添加一个应用useNameSpace,在反 向解析URL时使用URL的实例命名空间。,具体操作步骤:演示3.6实践:为HelloWorld项目增加导航铤接,修改第一章中创建的HelloWorld项目,为其增加导航 链接,如图3-27所示。.x 127.0.0,1:8000 X+(今。127.0.0.1:8000 *0:Hello World!导航列表:关干 HelluWorld