Django路径匹配失败:URL无法匹配路由定义的模式
Django路由与视图参数不匹配问题修复方案
核心问题分析
你的代码存在两个关键错误:
- 路由定义格式错误:
path路径开头不需要加斜杠,且未捕获视图函数必需的url参数 - 视图依赖
url参数,但路由未传递该参数,导致调用视图时参数缺失
具体修复步骤
1. 修正路由配置
修改web.py中的metrics路由,去掉开头斜杠,并添加参数捕获规则,让路由能把短链接标识传递给视图:
from django.urls import path from django.contrib import admin from heyurl import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.index, name='index'), path('store', views.store, name='store'), # 捕获短链接标识作为url参数,传递给视图函数 path('<str:url>/metrics/', views.get_month_metrics, name='metrics'), ]
2. 修复视图中的潜在异常
原视图中直接用filter(...)[0]获取数据,若找不到对应记录会抛出索引错误,建议改用get_object_or_404处理:
from django.shortcuts import render, redirect, get_object_or_404 # 新增引入 from django.http import HttpResponse from .models import Url, Click from django.core.validators import URLValidator, ValidationError from heyurl.utils import db_services, helper from django_user_agents.utils import get_user_agent from django.template.defaulttags import register from datetime import datetime def get_month_metrics(request, url): today = datetime.now() # 找不到对应短链接时返回404页面,避免索引错误 url_obj = get_object_or_404(Url, short_url=url) ident = url_obj.id # GETTING THE CLICKS THIS MONTH clicks_this_month = Click.objects.filter(url=ident, created_at__year=today.year, created_at__month=today.month) # TOTAL CLICKS PER BROWSER safari = Click.objects.filter(url=ident, browser__contains='safari') chrome = Click.objects.filter(url=ident, browser__contains='chrome') firefox = Click.objects.filter(url=ident, browser__contains='firefox') # TOTAL CLICKS PER PLATFORM mobile = Click.objects.filter(url=ident, platform='Mobile') pc = Click.objects.filter(url=ident, platform='PC') #CONTEXT TO DISPLAY ON DATA PANEL context = { 'url': url, 'clicks': len(clicks_this_month), 'safari': len(safari), 'chrome': len(chrome), 'firefox': len(firefox), 'mobile': len(mobile), 'pc': len(pc), } return render(request, 'heyurl/metrics.html', context)
3. 测试访问路径
现在你可以通过类似http://你的域名/RQvw4/metrics/的路径访问,路由会自动把RQvw4作为url参数传递给视图函数,即可正常渲染统计页面。
关于硬编码路由的说明
你之前尝试的硬编码路由path('RQvw4/metrics/', views.get_month_metrics, name= 'metrics')会报错,是因为视图需要url参数,但该路由未传递任何参数。如果非要硬编码(不推荐,不具备通用性),可以手动指定参数:
path('RQvw4/metrics/', views.get_month_metrics, {'url': 'RQvw4'}, name='metrics')
内容的提问来源于stack exchange,提问作者shuberman
相关产品推荐
相关产品推荐

