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
相关产品推荐
相关产品推荐

