在 Web 开发中,“路由”就是连接用户请求与处理逻辑之间的桥梁。无论是访问页面、提交表单,还是请求 API 接口,本质上都是通过一个 URL 找到正确的处理代码——这就需要路由匹配机制。
本文将系统讲解路由匹配的常见形式及其使用技巧,覆盖后端(如 Django、Flask、Express)和前端(如 Vue、React Router)常见模式。
路由匹配(Route Matching) 指的是框架根据用户访问的 URL 地址,匹配一条符合规则的路由规则,并将请求转发给对应的视图函数或组件。
举个例子:
访问地址: /users/123/profile
匹配路由: path(“users/int:id/profile/”, views.profile)
此时参数 id=123
被提取,交给 views.profile
处理。
匹配完全相同的路径。
Django:
path("about/", views.about)
Flask:
@app.route('/about')
Express:
app.get('/about', handler)
Vue Router:
{ path: '/about', component: About }
注意:末尾 /
是否必须,依框架而定。
使用变量作为路径的一部分,可提取路径参数。
Django:
path('users//' , views.user_detail)
Flask:
@app.route('/users/' )
Express:
app.get('/users/:userId', handler)
Vue Router:
{ path: '/users/:userId', component: UserProfile }
常用类型说明(以 Django 为例):
类型 | 说明 | 示例匹配 |
---|---|---|
str (默认) |
任意非空字符串 | /article/hello/ |
int |
整数 | /users/123/ |
slug |
英文字母数字和横线 | /post/my-title/ |
uuid |
UUID 类型 | /file/550e8400/ |
path |
路径(可包含 / ) |
/media/foo/bar |
部分框架支持路径参数可选。
Flask(需自定义逻辑):
@app.route('/users/', defaults={'user_id': None})
@app.route('/users/' )
Express:
app.get('/users/:userId?', handler)
Vue Router:
{ path: '/users/:userId?', component: UserProfile }
Django 不直接支持路径级别的“可选参数”,需通过多个
path()
组合实现。
用于复杂的路由匹配规则。
Django:
re_path(r'^page/(?P[\w-]+)\.html$' , views.page)
Flask:
需通过自定义 converter:
from werkzeug.routing import BaseConverter
Express:
app.get(/^\/product\/(\d{3,})$/, handler)
使用正则时需注意可读性与性能。
用于“匹配任意路径”的情况,常见于前端框架或 404 页面处理。
Django:
path('/' , views.catch_all)
Express:
app.get('*', handler404)
Vue Router:
{ path: '/:pathMatch(.*)*', component: NotFound }
常见于前端 SPA 应用(如 Vue/React Router)。
{
path: '/users',
component: UserLayout,
children: [
{ path: '', component: UserHome },
{ path: ':id', component: UserProfile }
]
}
路由匹配通常遵循“从上到下”或“先注册先匹配”的顺序。
因此,越具体的路由要写在前面,避免被通配路由截胡。例如:
# 正确顺序
path('users/add/', views.add_user)
path('users//' , views.user_detail)
错误顺序可能导致 users/add/
被误当作 ID。
name="xxx"
)搭配 URL 反转使用include()
组织子路由模块,提高可维护性history
路由时需配置 Nginx 转发策略(如 fallback 到 index.html)匹配类型 | 应用场景 |
---|---|
精确匹配 | 静态页面 /about |
动态参数 | 详情页 /users/:id |
可选参数 | 搜索页 /search/keyword? |
正则匹配 | 旧系统兼容 /page-xxx.html |
通配符 | 404 页面 / 未知路径匹配 |
嵌套路由 | 前端模块结构化路由 |
掌握这些常见形式后,无论是写前端Vue Router,还是后端Django、Express,都能更加灵活、清晰地组织路由逻辑。