Django-debug-toolbar: La barre d'outils ne s'affiche pas pour les requêtes POST

Créé le 4 oct. 2017  ·  6Commentaires  ·  Source: jazzband/django-debug-toolbar

Salut, j'essaie de déboguer un problème où les demandes POST ne font pas apparaître la barre d'outils, pour toute autre demande GET , la barre d'outils de débogage s'affiche très bien, ne semble pas être un problème pour les autres utilisateurs, donc je me demande si quelque chose empêche la barre d'outils de se déclencher ou s'il ne s'agit pas d'une fonctionnalité prise en charge.

Cela ne se produit que sur demande faite à ViewSets , ModelViewSet de django rest framework, semble fonctionner très bien, comment puis-je comprendre ce qui ne va pas ?

Commentaire le plus utile

Voici mon middleware pour contourner ce problème :

def Fix_XMLHttpRequest(get_response):
    def middleware(request):
        # When `POST`ing data from the DRF browsable API, it will set the
        # header `X_REQUESTED_WITH: XMLHttpRequest`. (Not sure if the browser
        # adds that header of if DRF's front-end does, but that doesn't matter,
        # the header is there.) It's a little contradictory that the header is
        # there since the browser also requests that the response be 'text/html'.
        # Anyway, that's fine except for one thing. Django Debug Toolbar will
        # not show the debug toolbar whenever that header is set on the request!
        #
        # See:
        #   - https://github.com/jazzband/django-debug-toolbar/blob/c201ce34cea3ba4ce99d1642db17f2cb31c6204e/debug_toolbar/middleware.py#L59
        #   - https://docs.djangoproject.com/en/2.1/_modules/django/http/request/#HttpRequest.is_ajax
        #
        # My workaround is to remove that header whenever the request explicitly
        # asks for 'text/html'. Again, in my opinion, that header doesn't really
        # make sense anyway when the browser wants to receive HTML back.
        #
        # This makes is so that when you POST data from the DRF browsable API,
        # you can still see the Django Debug Toolbar. It maintains the desired
        # behavior of _not_ showing the toolbar when you POST from Javascript
        # to obtain JSON data.

        if 'text/html' in request.META.get('HTTP_ACCEPT', ''):
            if request.META.get('HTTP_X_REQUESTED_WITH', '') == 'XMLHttpRequest':
                del request.META['HTTP_X_REQUESTED_WITH']

        response = get_response(request)

        return response

    return middleware

Assurez-vous d'ajouter ce middleware _avant_ le middleware de votre Django Debug Toolbar.

Tous les 6 commentaires

Je commencerais ici https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/middleware.py#L58 , respectivement avec le SHOW_TOOLBAR_CALLBACK .

Je ne sais pas pourquoi les requêtes POST seraient ignorées par la barre d'outils ?

Voici mon middleware pour contourner ce problème :

def Fix_XMLHttpRequest(get_response):
    def middleware(request):
        # When `POST`ing data from the DRF browsable API, it will set the
        # header `X_REQUESTED_WITH: XMLHttpRequest`. (Not sure if the browser
        # adds that header of if DRF's front-end does, but that doesn't matter,
        # the header is there.) It's a little contradictory that the header is
        # there since the browser also requests that the response be 'text/html'.
        # Anyway, that's fine except for one thing. Django Debug Toolbar will
        # not show the debug toolbar whenever that header is set on the request!
        #
        # See:
        #   - https://github.com/jazzband/django-debug-toolbar/blob/c201ce34cea3ba4ce99d1642db17f2cb31c6204e/debug_toolbar/middleware.py#L59
        #   - https://docs.djangoproject.com/en/2.1/_modules/django/http/request/#HttpRequest.is_ajax
        #
        # My workaround is to remove that header whenever the request explicitly
        # asks for 'text/html'. Again, in my opinion, that header doesn't really
        # make sense anyway when the browser wants to receive HTML back.
        #
        # This makes is so that when you POST data from the DRF browsable API,
        # you can still see the Django Debug Toolbar. It maintains the desired
        # behavior of _not_ showing the toolbar when you POST from Javascript
        # to obtain JSON data.

        if 'text/html' in request.META.get('HTTP_ACCEPT', ''):
            if request.META.get('HTTP_X_REQUESTED_WITH', '') == 'XMLHttpRequest':
                del request.META['HTTP_X_REQUESTED_WITH']

        response = get_response(request)

        return response

    return middleware

Assurez-vous d'ajouter ce middleware _avant_ le middleware de votre Django Debug Toolbar.

Je ne suis pas sûr que ce soit bien ou pas. J'essaie d'utiliser plusieurs façons de capturer la demande de publication mais je ne peux toujours pas, cela signifie que si vous utilisez la demande sur le site Web avec la méthode 'get', évidemment, ce n'est pas un problème. Le but que j'utilise Django est de développer le serveur pour le client mobile et la plupart des méthodes de requête sont 'POST' . J'espère que vous pourrez m'aider, merci.

Ce qui a fonctionné pour moi (en combinaison avec l'API navigable de Django REST Framework) est ce django-debug-toolbar-history .

django-debug-toolbar-history a également fonctionné pour moi en utilisant les pages de développement DRF navigables.

Cela m'a permis de suivre les requêtes SQL utilisées lors d'un POST.

Fermeture car le panneau d'historique a été publié. J'ai également confirmé que pour les requêtes POST renvoyées et les réponses HTML, la première barre d'outils s'affiche.

Si vous mettez à jour vers la dernière version et continuez à rencontrer un bogue, veuillez rouvrir avec de nouveaux détails. Merci.

Cette page vous a été utile?
0 / 5 - 0 notes