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

Django项目功能正常但终端报User.DoesNotExist错误求助

CS50W Network项目异常排查与解决

问题背景

开发CS50W第4个项目Network时,出现以下异常:

  • 访问用户个人主页,页面功能完全正常,但终端抛出User.DoesNotExist异常;
  • 访问首页(index路由),终端同样出现该异常,尽管首页未调用profile视图。

查看终端日志确认,异常根源是浏览器请求/favicon.ico时,被<str:username>路由匹配到profile视图,导致尝试查询名为favicon.ico的用户失败。

相关代码片段

urls.py

from django.urls import path

from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("create_post", views.create_post, name="create_post"),
    path("<str:username>", views.profile, name="profile")
]

profile视图

def profile(request, username):
    user = User.objects.get(username=username)
    posts = Post.objects.filter(owner=user).order_by('-timestamp')

    print(f'Current username: {user.username} ({user.email})')

    return render(request, 'network/profile.html', {
        'username': user,
        'followed': user.followers.filter(username=request.user.username),
        'posts': posts
    })

解决思路与方案

方案1:添加favicon专属路由(优先匹配)

Django路由按从上到下顺序匹配,在<str:username>路由前添加专门处理favicon.ico的路由,避免其进入profile视图:

修改urls.py:

from django.urls import path
from django.views.generic.base import RedirectView

from . import views

urlpatterns = [
    path("", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("create_post", views.create_post, name="create_post"),
    # 优先匹配favicon请求,重定向到静态资源
    path('favicon.ico', RedirectView.as_view(url='/static/favicon.ico')),
    path("<str:username>", views.profile, name="profile")
]

注:需确保项目static目录下存在favicon.ico,或调整RedirectView的url到正确图标路径。

方案2:优化profile视图的异常处理

在profile视图中捕获用户不存在的异常,返回404页面,避免服务器报错:

修改profile视图:

from django.shortcuts import get_object_or_404

def profile(request, username):
    # 使用get_object_or_404替代get,用户不存在时直接返回404
    user = get_object_or_404(User, username=username)
    posts = Post.objects.filter(owner=user).order_by('-timestamp')

    print(f'Current username: {user.username} ({user.email})')

    return render(request, 'network/profile.html', {
        'username': user,
        'followed': user.followers.filter(username=request.user.username),
        'posts': posts
    })

该方案可解决异常报错问题,但浏览器请求favicon时仍会得到404,建议结合方案1使用。

方案3:限制username路由的匹配规则

使用正则表达式限制<str:username>的匹配范围,仅允许符合用户名规则的字符串(比如不含.):

修改urls.py中的profile路由:

from django.urls import path, re_path

from . import views

urlpatterns = [
    # ...其他路由
    # 仅匹配字母、数字、下划线组成的用户名
    re_path(r'^(?P<username>[a-zA-Z0-9_]+)$', views.profile, name="profile")
]

此规则下,favicon.ico因包含.不会被匹配,转而触发404(若未配置favicon路由)。

总结

优先推荐方案1+方案2的组合:通过专属路由处理favicon请求保证图标正常加载,同时在视图中做异常捕获避免服务器报错。

内容的提问来源于stack exchange,提问作者Fernando Velasco Borea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:34:59