You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django路径匹配失败:URL无法匹配路由定义的模式

Django路由与视图参数不匹配问题修复方案

核心问题分析

你的代码存在两个关键错误:

  1. 路由定义格式错误:path路径开头不需要加斜杠,且未捕获视图函数必需的url参数
  2. 视图依赖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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:10:34