Django中url与path及re_path的区别说明

沈知远
沈知远
发布时间:2026-10-14| 4人浏览过
原创

本文详细解析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的写法,这样很容易出错,到了关键时刻,很难定位问题点,很浪费时间.

以上为个人经验,希望能给大家一个参考,也希望大家多多支持本站。如有错误或未考虑完全的地方,望不吝赐教。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。