Python中Django/Flask路由中,变量和常量重复会不会有问题?
比如 url 路由地址:
变量路由 example.com/<username>/
常量路由 example.com/management/
因为 username 是变量,要是有一个用户刚好注册的用户名,也是 management,那路由系统会不会冲突?
Python中Django/Flask路由中,变量和常量重复会不会有问题?
10 回复
按顺序匹配,匹配到第一个结构之后中止。
所以注意好优先级不会冲突,比如你这个可以把常量放在上面,匹配到之后就不会再去匹配变量了。
在Django或Flask的路由系统中,如果变量和常量路径片段重复,通常会导致路由匹配失败或出现意外行为。
Django示例:
# urls.py - 错误示例
from django.urls import path
from . import views
urlpatterns = [
path('user/<str:username>/', views.user_detail), # 变量路由
path('user/admin/', views.admin_detail), # 常量路由 - 这会出问题
]
# 正确做法:调整顺序或使用不同的路径
urlpatterns = [
path('user/admin/', views.admin_detail), # 常量路由放前面
path('user/<str:username>/', views.user_detail), # 变量路由放后面
]
Flask示例:
from flask import Flask
app = Flask(__name__)
# 错误示例
@app.route('/user/<username>/')
def user_detail(username):
return f"User: {username}"
@app.route('/user/admin/') # 这个路由永远不会被匹配到
def admin_detail():
return "Admin page"
# 正确做法
@app.route('/user/admin/') # 具体路由放前面
def admin_detail():
return "Admin page"
@app.route('/user/<username>/') # 通用路由放后面
def user_detail(username):
return f"User: {username}"
关键点:
- 路由匹配按定义顺序进行,第一个匹配的路由会被执行
<username>这样的变量路径会匹配包括"admin"在内的任何字符串- 常量路由
/user/admin/放在变量路由后面时,访问/user/admin/会先被变量路由匹配
总结建议: 定义路由时要把具体的常量路由放在通用的变量路由前面。
推荐做法是通过设计来避免 url 冲突, 例如你的例子里面,变量路由可以改为 example.com/user/<username>/
Flask 中 不会冲突,Django 没用过不知道。
Flask 先匹配常亮路由,之后匹配变量路由。
通过保留字、限制用户名长度解决会不会更好点呢。
那干嘛要设计这么蛋疼的路由
可能只是为了一个看似美观的 URL
短小方便易输入
weibo.com/{username}
weibo.com/login
自己试一下不就知道了么
login, admin, management 这类词不要给用户注册

