【问题标题】:Laravel's dd() equivalent in djangoLaravel 在 django 中的 dd() 等价物
【发布时间】:2021-03-01 14:39:24
【问题描述】:

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

我已经搜索过了。但是没有发现任何有用的东西。我试过pprint()simplejsonprint(type(object){% debug %}。但是它们都不能提供有关对象的所需信息。 这是 Laravel 的 dd() 函数的示例输出。

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

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

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

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

【问题讨论】:

标签: python django laravel debugging flask


【解决方案1】:

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

print(object.__dict__)

使用pprint美化输出

from pprint import pprint
pprint(dir(object))

【讨论】:

  • 如何在 laravel 等浏览器上查看?
  • @roll 你没有简单的方法可以做到这一点,使用控制台输出
  • 如果您还想查看值,也可以使用 vars:from pprint import pprint pprint(vars(prospect))
【解决方案2】:

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

只是:

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

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

【讨论】:

    【解决方案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)
    

    就是这样。

    【讨论】:

      【解决方案4】:
      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.
      

      【讨论】:

        猜你喜欢
        • 2019-05-18
        • 2011-01-11
        • 2010-11-07
        • 2017-11-22
        • 2012-02-18
        • 2015-02-06
        • 2021-08-24
        • 2011-05-31
        • 1970-01-01
        相关资源
        最近更新 更多