Django中url与path及re_path的区别说明
本文详细解析Django框架中url、path及re_path函数的区别与用法。重点介绍Django 2.x版本中path和re_path的引入背景,对比两者在参数捕获、类型转换器及正则表达式使用上的差异。同时提供从Django 1.x迁移至2.x时的常见配置问题及解决方案,包括namespace设置和模块导入注意事项,帮助开发者正确配置URL路由。
Django中url与path及re_path区别
初学者往往难以区分这三者的具体差异,因此在此进行简要介绍。首先,url是Django 1.x版本中使用的配置方式。自Django 2.1版本起,官方开始逐步弃用Django 1.x中的url写法,转而推荐新的路由配置方法。
在Django 2.x及更高版本中,描述URL配置主要涉及两个函数:path和re_path。其中,re_path()函数可以视为Django 1.x中url函数的替代或延续,它允许在路径配置中使用正则表达式进行匹配。
一、path和url的区别:
django.urls path
django.conf.urls url
path与url属于不同的模块,但两者的核心效果都是响应并返回页面。path调用的是Python第三方模块或框架内置的功能,而url则是早期自定义的模块实现,通常对应Views下的def函数以及URL中传递的参数值。
例如:
url(r'^login',views.login),
def login(request):
return render(request,'login.html')
1、url
在settings.py文件中存在一个ROOT_URLCONF设置项,该设置指定了当访问网址时,系统通过哪一个url文件去匹配所请求的网址。
url参数
url或者re_path的配置相对复杂,例如正则表达式r'^blog/(?P<num>[0-9]{4})/'。首先需要包含开始符^和结尾符$。括号()代表一个匹配参数,即(?P<匹配的字段名>正则表达式)的形式用于捕获特定字段。
(?P<匹配的字段名>正则表达式)
进行匹配时,不包括get或者post请求方式中的查询参数及域名部分。例如www.qq.com/blog?num=1,系统不会匹配问号?后面的字符。
可以给request参数设置一个默认值,这在处理最常见的分页url时非常常见,例如:
urlpatterns=[
url(r'^page/$',views.page),
url(r'^page(?P<num>[0-9]+)$',views.page)
]
#views
def page(request,num='1'):
pass
自定义错误页面关键字handler400=blog.views.page_no_find
#urls.py
…
handler400=blog.views.page_no_find
2、path
参数的使用方法path('blog/str:string/')变得简单了许多,主要使用尖括号。前边是str代表参数的类型,后面代表参数的名称。
path参数类型
捕获url中的参数需要用到尖括号<>,指定尖括号中的值类型,比如int:astr:link。这个转换器还有许多其他类型,例如:
int 匹配0和正整数
str 匹配任何非空字符串但不包括/
slug 可理解为注释,匹配任何ascii码包括连接线和下划线
uuid 匹配一个uuid对象(该对象必须包括破折号—,所有字母必须小写)
path 匹配所有的字符串,包括/(意思就是path前边和后边的所有路径)
3.re_path
如果遇上路径和转换器语法都不足以定义的URL模式,那么就需要使用正则表达式,这时候就需要使用re_path(),而非path()。
举例:传递 数字结尾的参数
re_path(r'(\d+)/$',views.peopleList,name='peopleList'),
二、python3中使用django2,常见设置path问题
1.Django2中使用
在python3中使用django2的时候,在设置urls的时候,会遇到一些坑。这里做一下记录。
系统的urls.py里,在1.X的时候,都是采用的url方式。如下
url(r'^', include("test1.urls")),
在2.0中,它推荐使用的是path模块,所以这里就改写一下。引包
from django.urls import path
path('', include("test1.urls")),
注意:
如果要使用正则,则要引入re_path,from django.urls import path, re_path
这里面的正则写法,有点意思,一定要使用()把正则包起来,然后用?P正式表达式 这种形式来表式
2.APP中使用path
1.x里面的写法是
url(r'^page=(\d+)&key=(\w+)$', views.detail, name=”detail”),
现在的写法
re_path('page=(?P<page>\d+)&key=(?P<key>\w+)', views.detail, name="detail"),
这样一对比就能明白了吧,使用的链接是http://127.0.0.1:8000/page=12&key=abc
3.系统的urls.py里的namespace的问题
1.x中写法
url(r'^', include("test1.urls", namespace='test1')),
可是在2.0中你这么写,会报错,说什么app_name的,这个自己可以看一下,怎么解决呢,其实很简单,只要在自己项目urls.py中加上这句就行了.如果不加的话可能报错,
app_name = 'test1'(你的APP名)
注:
使用url也是可以的,为了简便起见,尽量使用符合版本的字段,另外在写路径时应该严格按照语法,比如'^' 和/$就不能缺,不能前面写url,括号里面确按照path的写法,这样很容易出错,到了关键时刻,很难定位问题点,很浪费时间.
以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。如有错误或未考虑完全的地方,望不吝赐教。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













