debugging Laravel的dd()在django中的等价形式

oewdyzsn  于 2022-11-30  发布在  Go
关注(0)|答案(5)|浏览(148)

我是Django的新手,很难弄清楚如何打印一个对象里面的内容。我指的是变量的类型和值,以及它里面的成员。就像Laravel的dd(object)函数一样。Laravel的dd()是一个调试应用程序的方便工具。
我搜索过它。但是没有找到任何有用的东西。我试过pprint()simplejsonprint(type(object){% debug %}。但是它们都不能提供关于对象的所需信息。下面是Laravel的dd()函数的示例输出。

在这个图像中,我正在打印Laravel的请求对象。正如你所看到的,它显示了关于一个对象的完整信息。我指的是它所属的类名,它的成员变量。还有它的类名和值。它一直深入挖掘对象内部,并打印所有信息。
但是我在Django中找不到类似的工具,很难相信Django没有这样一个有用的工具,因此我想知道有没有第三方软件包可以做到这一点。
我正在使用Django 2.0.5版,并尝试打印django.contrib.messages
另外,我希望输出结果显示在浏览器中,而不是控制台中。这就是为什么我要求一个Django包,它可以接收对象并呈现一个格式良好的对象架构表示。

myss37ts

myss37ts1#

您正在寻找__dict__属性或dir()

print(object.__dict__)

使用pprint进行美化输出

from pprint import pprint
pprint(dir(object))
dauxcl2d

dauxcl2d2#

引发一个异常。假设你已经调试了,你会看到异常消息。它很粗糙,但它在过去帮助了我。
只是:

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

其他的回答和评论者忽略了dd()函数中至关重要的“and die”部分,它阻止了诸如后续重定向之类的事情。

3npbholx

3npbholx3#

实际上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

当您需要使用此函数时,只需在任何www.example.com中这样调用它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)

就是这样。

jq6vz3qz

jq6vz3qz4#

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.
gpnt7bae

gpnt7bae5#

我正在寻找类似的东西,有这个python包django-dump-die,提供正是这一点,它的灵感来自laravel. https://pypi.org/project/django-dump-die/0.1.5/

相关问题