Django项目views.py中print()终端无输出 模板变量渲染异常
Django项目print调试无输出、模板变量不渲染问题排查
问题背景
基于SQLite3、使用Django ORM实现数据操作的项目中,在views.py添加print()函数做调试时,终端始终无对应打印输出,无法开展调试工作。已在Python shell中验证,相关QuerySet可以正常运行。
同时出现关联异常:视图传递给模板的all_books变量无法在index.html中正常渲染,页面无法展示对应对象内容。
相关代码
视图层 views.py
from django.shortcuts import render,redirect from .models import BookBoardModel def index(request): all_books = BookBoardModel.objects.all() print(all_books) for item in all_books: print(item.title) context = {'all_books': all_books} return render(request, 'category_books_page/index.html', context)
模板层 index.html
{{all_books}} It is not showing at all :(
路由配置
- app内路由
category_books_page/urls.py
from django.urls import path from django.contrib import admin from . import views urlpatterns = [ path('', views.index, name='bookHome'), ]
- 项目根路由
config/urls.py
from django.contrib import admin from django.urls import path, include from signup_page import views urlpatterns = [ path('admin/', admin.site.urls), path('', include('default_page.urls')), path('category_books_page/', include('category_books_page.urls')), path('api-auth/', include('rest_framework.urls', namespace='rest_framework')) ]
异常表现
- 运行Django开发服务的终端仅显示警告信息,无任何
print()输出内容 - 访问对应页面时,模板中
{{all_books}}完全不渲染,仅显示后续写死的文本 - Python shell中直接执行
BookBoardModel.objects.all()可正常返回查询结果
排查&解决方法
print无输出、模板变量不渲染两个问题同时出现,核心原因是请求根本没有走到你写的这个index视图逻辑里,按以下顺序排查:
- 首先确认访问地址正确
根路由给category_books_page分配的路径前缀是/category_books_page/,正确访问地址为http://127.0.0.1:8000/category_books_page/。如果直接访问根路径/,匹配到的是default_page.urls下的视图,完全不会执行当前写的index函数,自然不会有print输出,模板也拿不到all_books变量。 - 验证视图是否真的被触发
临时修改视图逻辑,直接返回固定字符串做测试:
访问对应地址如果看不到这段文字,可直接确认是路由匹配错误,请求没有走到当前视图。from django.http import HttpResponse def index(request): return HttpResponse("测试:当前index视图已被触发") - 检查模板路径冲突
排查项目中其他app的templates目录下,是否存在同名路径category_books_page/index.html。Django模板查找按INSTALLED_APPS的注册顺序遍历,如果前面注册的app存在同路径模板,会直接加载对应模板,不会使用当前app下的模板文件,甚至可能出现其他视图渲染了同路径模板的情况。 - 确认开发服务正常加载最新代码
如果修改代码后没有重启Django开发服务,服务运行的还是旧版本代码,自然不会执行新加的print逻辑。注意如果settings.py中DEBUG=False,开发模式不会自动重载代码修改,必须手动重启服务。 - 处理终端输出缓冲问题
如果确认请求已经走到视图,还是看不到print输出,给print加flush=True参数强制刷新输出缓冲即可,部分Windows终端、IDE内置终端默认会缓存输出,不刷新不会实时显示print内容:print(all_books, flush=True) - 检查app注册状态
确认category_books_page已经添加到settings.py的INSTALLED_APPS列表中,未注册的app无法被Django正常识别路由、模板、模型,也会导致路由匹配异常。
内容的提问来源于stack exchange,提问作者Lucky Im
相关产品推荐
相关产品推荐

