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}"

关键点:

  1. 路由匹配按定义顺序进行,第一个匹配的路由会被执行
  2. <username>这样的变量路径会匹配包括"admin"在内的任何字符串
  3. 常量路由/user/admin/放在变量路由后面时,访问/user/admin/会先被变量路由匹配

总结建议: 定义路由时要把具体的常量路由放在通用的变量路由前面。

推荐做法是通过设计来避免 url 冲突, 例如你的例子里面,变量路由可以改为 example.com/user/<username>/

Flask 中 不会冲突,Django 没用过不知道。
Flask 先匹配常亮路由,之后匹配变量路由。

通过保留字、限制用户名长度解决会不会更好点呢。

那干嘛要设计这么蛋疼的路由


可能只是为了一个看似美观的 URL

短小方便易输入

weibo.com/{username}
weibo.com/login

自己试一下不就知道了么

login, admin, management 这类词不要给用户注册

回到顶部