Django re_path无法匹配带查询参数的URL跳转至对应视图问题
问题根因
Django 的 URL 路由(包括 re_path、path)只会匹配 URL 中的路径部分,不会匹配 ? 之后的查询参数(Query String),你把查询参数 paymentId 写进 re_path 的正则规则里完全不会生效。访问带参数的URL时,路由识别到的路径还是 /localDeliveryPayment,自然会匹配到第二个规则走 Payment 视图。
解决方案
方案1:把参数改为路径参数(推荐)
将参数放到URL路径中,匹配逻辑更清晰,调整后的路由配置如下:
urlpatterns = [ # 匹配形如 /localDeliveryPayment/00340000610febab0891e9008816d3e9 的请求 re_path(r'^localDeliveryPayment/(?P<UUID>[0-9a-z-]{32})$', verifyMobilePayReceived.as_view()), re_path(r'^localDeliveryPayment$', Payment.as_view(), name = 'localDeliveryPayment'), ]
方案2:单视图内按查询参数分发逻辑
如果必须保留查询参数的URL形式,可以合并为一个路由,在视图内部根据参数判断执行对应逻辑:
- 先调整路由配置:
urlpatterns = [ re_path(r'^localDeliveryPayment$', Payment.as_view(), name = 'localDeliveryPayment'), ]
- 再在视图中做逻辑判断:
class Payment(View): def get(self, request, *args, **kwargs): payment_id = request.GET.get('paymentId') # 匹配paymentId参数规则时走校验逻辑 if payment_id and len(payment_id) == 32: return self.verify_mobile_pay_logic(request, payment_id) # 否则走原Payment视图的正常逻辑 # ... 原有逻辑代码 def verify_mobile_pay_logic(self, request, payment_id): # 原verifyMobilePayReceived视图的业务逻辑 # ... 原有逻辑代码
如果不想改动原有两个视图的结构,也可以在路由层新增分发函数实现:
def delivery_payment_router(request): if 'paymentId' in request.GET: return verifyMobilePayReceived.as_view()(request) return Payment.as_view()(request) urlpatterns = [ re_path(r'^localDeliveryPayment$', delivery_payment_router, name = 'localDeliveryPayment'), ]
内容的提问来源于stack exchange,提问作者jxw
相关产品推荐
相关产品推荐

