Laravel在django中的dd()等效

时间:2018-05-27 15:43:29

标签: django laravel

我是Django的新手,并且很难弄清楚如何打印对象内部的内容。我的意思是变量的类型和值及其成员。就像Laravel的dd(object)函数一样。 Laravel的dd()是一个用于调试应用程序的便利工具。

我已经搜索过了。但没有发现任何有用我尝试过pprint()simplejsonprint(type(object){% debug %}。但是它们都不能提供有关对象的必要信息。 以下是Laravel的dd()函数的示例输出。 enter image description here

在这张图片中,我正在打印Laravel的请求对象。因为你可以看到它显示有关对象的完整信息。我的意思是它所属的类的名称,它的成员变量。还有它的类名和值。并且它不断挖掘对象内部并打印所有信息。

但是我无法在Django中找到类似的工具。很难相信Django没有这么有用的工具。因此,我想了解任何可以解决问题的第三方软件包。

我正在使用Django 2.0.5版。并尝试打印django.contrib.messages

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

4 个答案:

答案 0 :(得分:3)

您正在寻找__dict__财产或dir()

print(object.__dict__)

使用pprint进行美化输出

from pprint import pprint
pprint(dir(object))

答案 1 :(得分: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)

就是这样。

答案 2 :(得分:2)

引发异常。假定您已调试,您将看到异常消息。这很粗糙,但过去对我有所帮助。

只是:

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

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

答案 3 :(得分: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.