1、Python Web开发基础教程(Django版)第3章 URL分发本章主要内容:URL配置 URL参数传递 反向解析URL URL 命名空间3.1 URL分发机制简介 URL的基本格式为“协议:/域名或IP地址/路径/文件名”。域名或IP地址在Web服务器中分配给Web站点。路径是网络资源在Web服务器中的逻辑路径。文件名通常与网络资源的物理文件名一致。例如,http:/ manage.py startproject”命令创建项目时,Django默认在根URL配置模块中添加了“path(admin/,admin.site.urls)”。admin.site.urls是Django提供的管理站
2、点项目的URL配置模块。通过“admin”路径,来访问Django管理站点。本书将在8.1节中讲解使用Django管理站点的方法。3.2 URL配置URL配置指使用URL解析函数建立URL模式与视图函数之间的映射关系,也就是设置访问视图函数的URL规则。本节主要内容 URL解析函数 使用正则表达式 包含其他的URL配置3.2.1URL解析函数URL配置文件中的urlpatterns变量为URL解析函数的实例列表。Django提供两个URL解析函数:django.urls.path()和django.urls.re_path()。另外,django.conf.urls.url()是 django
3、.urls.re_path()的别名,并有可能在未来被弃用,应慎用 HelloWorld项目中的urls.py文件代码。from django.contrib import admin from django.urls import path from.import views urlpatterns=path(,views.hello,name=hello),path(admin/,admin.site.urls),其中:“from django.contrib import admin”导入Django的默认管理站点admin。“from django.urls import path”导
4、入URL解析函数path()。“from.import views”导入当前目录中的视图模块views(对应views.py文件)。Urlpatterns变量包含了两个URL映射。path(,views.hello,name=hello):第一个参数为空字符串,用于匹配只使用域名或IP地址的URL,如“127.0.0.1:8000”。第二个参数“views.hello”设置了URL匹配时调用的视图函数。第三个参数“name=hello”将URL模式的名称设置为“hello”。path(admin/,admin.site.urls):第一个参数为“admin/”,用于匹配“域名或IP地址/adm
5、in/”格式的URL,如“127.0.0.1:8000/admin/”。path()和re_path()函数的原型如下。path(route,view,kwargs=None,name=None)re_path(route,view,kwargs=None,name=None)访问Django站点的URL基本格式为“协议:/域名或IP地址/路径”。参数route为URL模式,用于匹配请求的URL中的“路径”。参数view用于设置路径匹配时调用的视图函数。可选参数kwargs用于设置传递给视图函数的附加数据。可选参数name为URL模式命名。在URL反向解析时用URL模式的名称可获得访问视图函数
6、的URL。path()和re_path()函数的第一个参数route都是字符串,re_path()函数将route参数作为正则表达式使用。3.2.2使用正则表达式 正则表达式提供了一种灵活的字符串匹配方式。re_path()函数使用正则表达式定义URL模式。下表列出了常用的正则表达式符号。符号符号说明说明示例示例示例说明示例说明|匹配其中一个选项ab|cd匹配ab或cd匹配字符串起始部分dj匹配任何以dj开始的字符串$匹配字符串末尾部分url$匹配任何以url结束的字符串*匹配零次或者多次出现的左端0-9*匹配以任意数字开始的字符串+匹配一次或者多次出现的左端0-9+匹配以一个或者多个数字字符
7、串?匹配零次或者一次出现的左端0-9?匹配零个或者一个数字N匹配N次左端0-95匹配5位数字字符串M,N匹配M次到N次左端0-92,5匹配25位数字字符串匹配括号中的任意一个abcd匹配a或者b或者c或者d-匹配指定范围中的一个字符a-f匹配a到f之间的任意一个字符不匹配指定的任何一个字符abc匹配不是a或b或c的任意字符常用的正则表达式正则表达式正则表达式匹配说明匹配说明0-9*$数字dn$n位的数字dn,$至少n位的数字dm,n$m-n位的数字(0|1-90-9*)$零和非零开头的数字(1-90-9*)+(.0-91,2)?$非零开头的最多带两位小数的数字(-)?d+(.d2,5)?$带2
8、5位小数的正数或负数(-|+)?d+(.d+)?$正数、负数、小数0-9+(.0-95)?$有两位小数的正实数0-9+(.0-91,3)?$有13位小数的正实数1-9d*$或或+?1-90-9*$非零的正整数-1-90-9*$或或-1-9d*$非零的负整数u4e00-u9fa50,$汉字.5,30$长度为530的所有字符A-Za-z+$由大小写英文字母组成的字符串A-Z+$由大写英文字母组成的字符串a-z+$由小写英文字母组成的字符串A-Za-z0-9+$由数字和大小写英文字母组成的字符串w+(-+.w+)*w+(-.w+)*.w+(-.w+)*$E-mail地址d15|d18$身份证号(15
9、位、18位数字)实例创建一个项目chapter3和应用useRe,在应用中定义视图函数,视图函数根据请求的URL不同输出相应的信息。具体操作步骤如下。演示3.2.3包含其他的URL配置1包含其他文件中的URL配置实例:为项目chapter3添加一个应用testinclude,为应用创建一个urls.py文件以配置URL访问应用的视图函数,并在项目chapter3的URL配置中包含应用的URL配置。具体操作步骤如下。演示2包含path()实例列表在前面的例子中,path(root/,include(testinclude.urls)包含了testinclude应用的urls.py中的URL配置。
10、可以在项目的URL配置文件中,定义path()实例列表来包含testinclude应用的urls.py中的URL配置。例如,可将项目的URL配置文件修改为如下代码。#chapter3chapter3urls.py from testinclude import views as subViews sub=path(sub2/,subViews.useinclude),urlpatterns=path(root2/,include(sub),#包含应用testinclude的URL配置 也可直接在include()参数中提供path()实例列表,示例代码如下。path(root2/,includ
11、e(path(sub2/,subViews.useinclude),)#包含应用testinclude的URL配置3.3 URL参数传递Django在执行URL解析时,可将URL路径的一部分解析为数据,将其作为参数传递给视图函数本节主要内容 获取URL中的数据 路径转换器 正则表达式中的变量 传递附加数据 使用带默认值的参数3.3.1获取URL中的数据使用path()函数解析URL时,可在URL模式中使用“”来捕获URL路径中的数据示例代码如下。path(test/,views.getData)Django在解析URL时,会将路径“/test/XXX/”中的“XXX”作为值传递给变量urlDa
12、ta。同时,应为getData()函数定义一个名为urlData参数。实例在项目视图文件“chapter3chapter3views.py”中添加一个视图函数,将从URL中获取的数据输出到响应页面。具体操作步骤:演示 默认情况下,Django将URL路径中获取的数据解析为字符串。可以使用下面的路径转换器来完成特定类型的转换。str:匹配除了路径分隔符(/)之外的非空字符串。在未指定转换器时,默认使用str。获取的数据为字符串。int:匹配0及正整数。获取的数据为int类型。slug:匹配字母、数字以及横杠、下划线组成的字符串。获取的数据为字符串。uuid:匹配格式化的UUID,如 075194
13、d3-6885-417e-a8a8-6c931e272f00。获取的数据为UUID实例。path:匹配任何非空字符串,包含了路径分隔符(/)。获取的数据为字符串。实例在项目视图文件“chapter3chapter3views.py”中添加视图函数,使用各种路径转换器。具体操作步骤:演示3.3.3正则表达式中的变量在path()函数中,可在URL模式中使用“”来捕获URL路径中的数据。在使用正则表达式时,可嵌套“(?P正则表达式)”来获取URL路径中的数据。实例:项目视图文件“chapter3chapter3views.py”中添加视图函数,在正则表达式中嵌套变量获取URL中的数据,将其输出到页
14、面。具体操作步骤:演示3.3.4传递附加数据可在path()和re_path()的第3个参数中为视图函数传递附加数据。实例:在项目视图文件“chapter3chapter3views.py”添加视图函数,为视图函数传递附加数据。具体操作步骤:演示3.3.5使用带默认值的参数可在视图函数中定义带有默认值的参数。要调用带默认值参数的视图函数,可在URL模式中定义带参数和不带参数的两种URL模式来映射视图函数。当访问不带参数的URL时,即可使用参数的默认值。实例:在项目视图文件“chapter3chapter3views.py”添加视图函数,在视图函数中使用带默认值的参数。具体操作步骤:演示3.4
15、反向解析URL反向解析URL指通过URL模式的名称或视图函数名称,来获得访问视图函数的URL。django.urls.reverse()函数用于反向解析URL本节主要内容 反向解析不带参数的命名URL模式 反向解析带参数的命名URL模式 反向解析视图函数 在模板中反向解析URL3.4.13.4.1反向解析不带参数的命名反向解析不带参数的命名URLURL模式模式当命名URL模式不带参数时,可用reverse(URL模式名称)语句来获得URL。实例:在项目视图文件“chapter3chapter3views.py”添加视图函数,在页面中输出浏览器请求的URL路径。具体操作步骤:演示3.4.2反向解
16、析带参数的命名URL模式如果URL模式使用了参数,在使用reverse()执行反向解析时,则可使用命名参数args或者kwargs设置反向解析参数,基本格式如下。reverse(URL模式名称,args=参数列表)reverse(URL模式名称,kwargs=参数字典)实例:在项目视图文件“chapter3chapter3views.py”添加视图函数,反向解析带参数的URL模式。具体操作步骤:演示3.4.33.4.3反向解析视图函数反向解析视图函数可使用视图函数名称作为reverse()函数参数来执行反向解析,这与反向解析命名URL模式类似。实例:在项目视图文件“chapter3chapte
17、r3views.py”添加视图函数,使用视图函数名反向解析URL模式。具体操作步骤:演示3.4.4在模板中反向解析URL在模板中也可使用反向解析来获得访问视图函数的URL,基本格式如下。%url URL模式名称 参数%有多个参数时,参数之间用空格分隔。实例:在项目视图文件“chapter3chapter3views.py”添加视图函数,在模板中使用反向解析获得访问视图函数的URL。具体操作步骤:演示3.5 URL命名空间本节主要内容URL命名空间简介使用URL的应用命名空间使用URL的实例命名空间3.5.13.5.1URLURL命名空间简介命名空间简介 URL命名空间与变量作用范围类似,它是命
18、名URL模式的使用范围。设 置了URL命名空间后,需按照“URL命名空间名称:URL模式名称”的格式来引用URL模式,例如“nameIndex:Default”。在反向解析URL时,Django在指定的URL命名空间中搜索URL模式名称。在不同的命名空间中,可使用相同的URL模式名称。正确使用URL命名空间,可对项目中的应用进行多次部署,即可通过不同的URL访问同一个应用,示例代码如下。path(usename1/,include(useNameSpace.urls,ns1),namespace=nameIndex),path(usename2/,include(useNameSpace.ur
19、ls,ns2),namespace=nameIndex2),Django将URL命名空间分为应用命名空间和实例命名空间。应用命名空间指正在部署的应用的URL命名空间名称。一个应用的多个实例可共享同一个应用命名空间,也可配置多个应用命名空间。例如,前面例子中“ns1”和“ns2”是应用命名空间名称。实例命名空间是应用特定实例的URL命名空间。实例命名空间名称在整个项目中必须唯一。实例命名空间名称可以与应用命名空间名称相同Django将其视为应用的默认实例。例如,默认的Django管理站点实例的实例命名空间名称为“admin”。3.5.2使用URL的应用命名空间 URL的应用命名空间可用两种方法来
20、定义:在应用的urls.py中使用app_name定义或者在include()函数中定义。在应用的urls.py中使用app_name定义应用命名空间的基本格式如下。app_name=usename 使用app_name定义的应用命名空间由应用的所有实例共享。在include()函数中定义应用命名空间的基本格式如下。include(pattern_list,app_namespace),namespace=None)其中,pattern_list是URL模式列表,app_namespace设置应用命名空间名称,namespace设置实例命名空间。3.5.33.5.3使用使用URLURL的实例命
21、名空间的实例命名空间 URL的实例命名空间在include()函数中进行定义,基本格式如下。include(module,namespace=None)#格式1 include(module,app_namespace),namespace=None)#格式2 其中,namespace参数用于定义URL的实例命名空间。Django要求在定义实例命名空间时,必须定义应用命名空间。使用格式1时,必须在参数module指定的urls.py中用app_name定义应用命名空间,否则会出错。使用格式2时,在include()函数的第一个二元参数组的第二个选项中指定实例命名空间名称(app_namespace)。实例在chapter3项目中添加一个应用useNameSpace,在反向解析URL时使用URL的实例命名空间。具体操作步骤:演示3.6 实践:为HelloWorld项目增加导航链接修改第一章中创建的HelloWorld项目,为其增加导航链接,如图3-27所示。