25

django-debug-toolbar は出力を html にする必要がありますが、django-tastypie のデフォルトの出力形式は json です。

送信しようとしhttp://localhost/api/v1/resource/?format=htmlましたが、Sorry, not implemented yet. Please append "?format=json" to your URL

このドキュメントでは有効なオプションの 1 つとして html がリストされていますが、TODO list.
http://django-tastypie.readthedocs.org/en/latest/serialization.html#to-html

デバッグ ツールバーを使用して Tastypie API 呼び出しをデバッグするにはどうすればよいですか?
(たとえば、API 呼び出しに対して実行されている SQL クエリの数を確認したい.. など)

多分私はdjangoビューからAPIを呼び出すことができますが、どのように?

4

8 に答える 8

39

これは、デバッグ ツールバーを有効にするために json を HTML でラップし、それをきれいに印刷する、同様の目的で私が作成したミドルウェアです。さらに、バイナリデータをサポートしています。私はtastypieを使用していませんが、それでも動作するはずです。

# settings-dev.py
from django.http import HttpResponse
import json   

MIDDLEWARE_CLASSES += (
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'NonHtmlDebugToolbarMiddleware',
)

class NonHtmlDebugToolbarMiddleware(object):
    """
    The Django Debug Toolbar usually only works for views that return HTML.
    This middleware wraps any non-HTML response in HTML if the request
    has a 'debug' query parameter (e.g. http://localhost/foo?debug)
    Special handling for json (pretty printing) and
    binary data (only show data length)
    """

    @staticmethod
    def process_response(request, response):
        if request.GET.get('debug') == '':
            if response['Content-Type'] == 'application/octet-stream':
                new_content = '<html><body>Binary Data, ' \
                    'Length: {}</body></html>'.format(len(response.content))
                response = HttpResponse(new_content)
            elif response['Content-Type'] != 'text/html':
                content = response.content
                try:
                    json_ = json.loads(content)
                    content = json.dumps(json_, sort_keys=True, indent=2)
                except ValueError:
                    pass
                response = HttpResponse('<html><body><pre>{}'
                                        '</pre></body></html>'.format(content))

        return response
于 2013-10-08T13:49:55.580 に答える
2

それは不可能だと思います。実行可能な解決策については、受け入れられた回答を参照してください。

これがあなたのアプローチがうまくいかなかった理由です:

答えがHTMLにないため、ツールバーは起動しません。他のすべての形式は、ツールバーのミドルウェアによって「解析」されてツールバーを含めることはできません。

ただし、独自のツールを追加してSQLクエリを表示することもできます。この単純なスニペットを見てください:http://djangosnippets.org/snippets/161/または、 django-snippetscreamのようなサードパーティのアプリを使用することもできます。

たとえば、DEBUG is Trueこの情報を確認して、Tastypieによって返される「メタ」オブジェクトに追加できます。

また、コンソール(runserver)のSQLロギングも確認してください。このためのいくつかの有用なリソース:http://dabapps.com/blog/logging-sql-queries-django-13/

于 2013-01-31T04:57:46.770 に答える
1
@html_decorator
def test(request):

    view = resolve("/api/v1/albumimage/like/user/%d/" % 2 )

    accept =  request.META.get("HTTP_ACCEPT")
    accept += ",application/json"
    request.META["HTTP_ACCEPT"] = accept   
    res = view.func(request, **view.kwargs)

    return HttpResponse(res._container)



def html_decorator(func):
    """                                                                                                                                                                                                                                                                       
    wrap it inside html                                                                                                                                                                                                                                                       
    """

    def _decorated(*args, ** kwargs):
        response = func(*args, **kwargs)

        wrapped = ("<html><body>",
                   response.content,
                   "</body></html>")

        return HttpResponse(wrapped)

    return _decorated

これが私がそれを解決した方法です。
自動ではありませんが、今のところは大丈夫です。

于 2013-02-01T13:59:08.467 に答える
1

https://github.com/django-debug-toolbar/django-debug-toolbar/pull/253 を試してください

pip install git+https://github.com/caktus/django-debug-toolbar@ajax-panel#egg=django-debug-toolbar

これにより、デバッグ ツールバーが呼び出しページの要求に関する情報を表示できるようになります。

または、HTML レンダラーが必要で、プロジェクトにあまり詳しくない場合は、django-rest-frameworkを強くお勧めします

于 2013-01-31T05:08:54.600 に答える