我来自PHP背景,我一直在努力学习Python,但是我在调试方面遇到了很多麻烦,因为我还不确定如何在Django或Python中解决这个问题.
我习惯于能够print_r或var_dumpPHP中的所有东西.我可以在控制器,服务层或甚至模型和数据中显示在我的Web浏览器中.
我不能在Django中这样做.根据我正在做的事情,尝试print从我的视图中执行一个对象将导致页面关闭或输出一些东西到我的控制台,这对我没有帮助.这是一个例子:
class Page(View):
def get(self, request, *args, **kwargs):
response = Data.objects.all()
# for whatever reason, I want to print something right now:
print response
# return JsonResponse({'success':response})
Run Code Online (Sandbox Code Playgroud)
以上内容将完全取消我的页面并发出通知说:
The view didn't return an HttpResponse object. It returned None instead.
Run Code Online (Sandbox Code Playgroud)
在使用CBV的时候有一些情况,我注意到我可以将数据转移到某个地方,例如控制台.但它不会对我有任何帮助.例如,如果我试图查看response上面的内容,它就会显示如下:
[object Object] [object Object] [object Object]
Run Code Online (Sandbox Code Playgroud)
A var_dump会让我真正看到它的内部.
所以我猜我错了.人们只是在用Python调试时转储数据吗?如果他们这样做,你如何执行此操作,并将其显示在Web浏览器或控制台中?如果没有,我如何处理Django中的基本故障排除?示例场景:
基本问题是您习惯了PHP如何连接到整个请求/响应链,而这不是开发Web应用程序时Python的配置方式.
在PHP-world中,服务器保证响应,从而关闭请求/响应周期.浏览器直接请求PHP文件,因此您不知道后台实际发生了什么.
典型的PHP请求与任何其他静态资产的请求相同,例如普通index.html文件或logo.gif.浏览器请求,Web服务器接受请求,然后返回响应; 唯一的区别是,如果.php请求了一个文件,那么它会经过一个中间步骤,PHP解释器会评估该文件,并将结果发送回客户端.
但是,在Python中,当一个请求被映射到Python后端进程(有时称为上游进程)时; Web服务器等待进程的响应(可以调整此超时).如果在定义的超时内未收到响应,则Web服务器将发送超时错误页面(504 ERROR).
Python进程负责发送正确的响应(包含所有标题等),如浏览器所期望的那样.在PHP中,这对您(作为开发人员)是隐藏的,因为PHP引擎将为您添加这些额外信息.因此,如果您的Python代码没有发送这样的响应(如您的情况),django会通过打印友好的错误消息来帮助您解决问题.
在您的情况下 - 视图不返回响应; 它只是打印一些东西.此print语句将转到应用程序的标准输出(或错误流)(如果您在shell上启动它,将打印在控制台上,或写入服务器的日志等),它将不会被发送回客户端(浏览器).
为了调试django应用程序:
DEBUG = True设置在你的settings.pypython manage.py runserver现在,当您执行任何打印语句时,它将显示在控制台上,如果您的应用程序代码中存在错误 - 只要您返回有效的响应 - 您将获得一个丰富的错误页面以及堆栈跟踪到帮助识别问题.
正在开发中不再有"调试语句和打印机上的东西"; 这就是Python连接到Web世界的方式.
对于您的其他问题:
我想查看列表或字典的内容
只需打印它.输出将在您的控制台上(与您编写的位置相同python manage.py runserver)
我想看看ORM正在执行的原始SQL查询
如果您在django shell中测试内容,可以.query在ORM调用结束时查看正在发送的查询:
>>> result = MyModel.objects.filter(foo='bar')
>>> result.query
(query printed here)
Run Code Online (Sandbox Code Playgroud)
要获得更丰富的调试体验,请安装django_debug_toolbar.
我想通过在内部滑动一些文本以在前端输出来查看是否正在执行某个功能
没有"输出到前端".对于这样的事情,您print()可以满足您的需求,甚至可以更好地使用日志记录系统.
| 归档时间: |
|
| 查看次数: |
781 次 |
| 最近记录: |