Laravel 在 django 中的 dd() 等效项

问题描述 投票:0回答:6

我是 Django 新手,很难弄清楚如何打印对象内部的内容。我的意思是变量的类型和值及其内部成员。就像 Laravel 的

dd(object)
函数一样。 Laravel 的
dd()
是一个用于调试应用程序的便捷工具。

我已经找到了。但发现没有什么用处。我尝试过

pprint()
simplejson
print(type(object)
{% debug %}
。但它们都无法提供有关对象的所需信息。 这是 Laravel 的
dd()
函数的示例输出。

在这张图片中,我正在打印 Laravel 的请求对象。正如您所看到的,它显示了有关对象的完整信息。我的意思是它所属的类的名称,它的成员变量。还有它的类名和值。它不断深入对象内部并打印所有信息。

但是我在 Django 中找不到类似的工具。很难相信 Django 没有这么有用的工具。因此我想知道任何可以做到这一点的第三方软件包。

我使用的是 Django 2.0.5 版本。并尝试打印 django.contrib.messages

另外,我希望输出显示在浏览器中,而不是控制台中。以一种易于阅读的方式,这就是为什么我需要一个 Django 包,它可以接收对象并呈现对象架构的格式良好的表示。

python django
6个回答
7
投票

您正在寻找

__dict__
房产或
dir()

print(object.__dict__)

使用pprint美化输出

from pprint import pprint
pprint(dir(object))

3
投票

提出例外情况。假设您已进行调试,您将看到异常消息。它很粗糙,但过去对我有帮助。

只是:

 raise Exception("I want to know the value of this: " + myvariable_as_a_string)

其他答案和评论者忽略了 dd() 函数中关键的“and die”部分,这会阻止后续重定向等事情。


3
投票

实际上Django并没有提供这个专门的功能。因此,为了摆脱这个问题,我制作了一个自定义的

dd()
类型函数,并在所有 Django 项目中使用它。也许它可以帮助某人。

假设我们有一个名为

app_libs
的库文件夹,在该文件夹中我们有一个名为
dump.py
的库文件。喜欢
app_libs > dump.py:

from django.core import serializers
from collections.abc import Iterable
from django.db.models.query import QuerySet
from django.core.exceptions import ObjectDoesNotExist


def dd(request, data=''):
    try:
        scheme      = request.scheme
        server_name = request.META['SERVER_NAME']
        server_port = request.META['SERVER_PORT']
        remote_addr = request.META['REMOTE_ADDR']
        user_agent  = request.META['HTTP_USER_AGENT']
        path        = request.path
        method      = request.method
        session     = request.session
        cookies     = request.COOKIES

        get_data = {}
        for key, value in request.GET.lists():
            get_data[key] = value

        post_data = {}
        for key, value in request.POST.lists():
            post_data[key] = value

        files = {}
        for key, value in request.FILES.lists():
            files['name'] = request.FILES[key].name
            files['content_type'] = request.FILES[key].content_type
            files['size'] = request.FILES[key].size

        dump_data = ''
        query_data = ''
        executed_query = ''
        if data:
            if isinstance(data, Iterable):
                if isinstance(data, QuerySet):
                    executed_query = data.query
                    query_data = serializers.serialize('json', data)
                else:
                    dump_data = dict(data)
            else:
                query_data = serializers.serialize('json', [data])


        msg = f'''
            <html>
                <span style="color: red;"><b>Scheme</b></span>        : <span style="color: blue;">{scheme}</span><br>
                <span style="color: red;"><b>Server Name</b></span>   : <span style="color: blue;">{server_name}</span><br>
                <span style="color: red;"><b>Server Port</b></span>   : <span style="color: blue;">{server_port}</span><br>
                <span style="color: red;"><b>Remote Address</b></span>: <span style="color: blue;">{remote_addr}</span><br>
                <span style="color: red;"><b>User Agent</b></span>    : <span style="color: blue;">{user_agent}</span><br>
                <span style="color: red;"><b>Path</b></span>          : <span style="color: blue;">{path}</span><br>
                <span style="color: red;"><b>Method</b></span>        : <span style="color: blue;">{method}</span><br>
                <span style="color: red;"><b>Session</b></span>       : <span style="color: blue;">{session}</span><br>
                <span style="color: red;"><b>Cookies</b></span>       : <span style="color: blue;">{cookies}</span><br>
                <span style="color: red;"><b>Get Data</b></span>      : <span style="color: blue;">{get_data}</span><br>
                <span style="color: red;"><b>Post Data</b></span>     : <span style="color: blue;">{post_data}</span><br>
                <span style="color: red;"><b>Files</b></span>         : <span style="color: blue;">{files}</span><br>
                <span style="color: red;"><b>Executed Query</b></span>: <span style="color: blue;"><br>{executed_query}</span><br>
                <span style="color: red;"><b>Query Data</b></span>    : <span style="color: blue;"><br>{query_data}</span><br>
                <span style="color: red;"><b>Dump Data</b></span>     : <span style="color: blue;"><br>{dump_data}</span><br>
            </html>
        '''

        return msg
    except ObjectDoesNotExist:
        return False

当你需要使用这个函数时,只需在任何views.py中这样调用即可:

from django.http import HttpResponse
from django.shortcuts import render
from django.views import View

from app_libs.dump import dd
from .models import Products

class ProductView(View):
    def get(self, request):
        data = {}
        data['page_title'] = 'products'
        data['products'] = Products.objects.get_all_product()

        template = 'products/collections.html'

        dump_data = dd(request, data['products'])
        return HttpResponse(dump_data)

        # return render(request, template, data)

就是这样。


1
投票

我一直在寻找类似的东西,有一个 python 包

django-dump-die
正是提供了这一点,它的灵感来自 Laravel。 https://pypi.org/project/django-dump-die/0.1.5/


0
投票
You can set breakpoint just after variable you need to inspect.

# for example your code looks like
...other code
products = Product.objects.all()
# here you set a breakpoint
breakpoint()
...other code
Now you need to call you code in this exact location and due to breakpoint it stops.
Then you want to look up in terminal, it switched to special mode where you need to 
enter code like this one:
products.__dict__ # and hit enter. Now you'll see all properties in your variable.

0
投票

我最近创建了一个名为 django-sonar 的包。 其中还包含一个名为 sonar() 的辅助函数,可将任何内容转储到调试仪表板。 来自 Laravel,没有望远镜和 dd(),我就无法生活。

© www.soinside.com 2019 - 2024. All rights reserved.