Django-debug-toolbar: POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдЯреВрд▓рдмрд╛рд░ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдЕрдХреНрддреВре░ 2017  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jazzband/django-debug-toolbar

рдирдорд╕реНрддреЗ, рдореИрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ POST рдЕрдиреБрд░реЛрдз рдЯреВрд▓рдмрд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХрд┐рд╕реА рдЕрдиреНрдп GET рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдбреАрдмрдЧ рдЯреВрд▓рдмрд╛рд░ рдареАрдХ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдЙрдкрдХрд░рдг рдкрдЯреНрдЯреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рдпрд╣ рд╕рдорд░реНрдерд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИред

рдпрд╣ рдХреЗрд╡рд▓ django рдЖрд░рд╛рдо рдврд╛рдВрдЪреЗ рд╕реЗ ViewSets , ModelViewSet рдЕрдиреБрд░реЛрдз рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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

рдЕрдкрдиреЗ Django рдбреАрдмрдЧ рдЯреВрд▓рдмрд╛рд░ рдХреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ _before_ рдЙрд╕ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рд╕рднреА 6 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ рдпрд╣рд╛рдВ SHOW_TOOLBAR_CALLBACK рд╕рд╛рде рдХреНрд░рдорд╢рдГ https://github.com/jazzband/django-debug-toolbar/blob/master/debug_toolbar/middleware.py#L58 рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЯреВрд▓рдмрд╛рд░ рджреНрд╡рд╛рд░рд╛ POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдХреНрдпреЛрдВ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

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

рдЕрдкрдиреЗ Django рдбреАрдмрдЧ рдЯреВрд▓рдмрд╛рд░ рдХреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ _before_ рдЙрд╕ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореИрдВ рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк 'рдкреНрд░рд╛рдкреНрдд' рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ Django рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдореЛрдмрд╛рдЗрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрд░реЛрдз рд╡рд┐рдзрд┐ 'POST' рд╣реИред рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рд▓реЛрдЧ рдореЗрд░реА рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рд░рд╛рд╣рдирд╛ рдХрд░реЗрдВред

рдореЗрд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ (Django REST рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп API рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ) рдпрд╣ django-debug-toolbar-history рд╣реИ ред

django-debug-toolbar-history рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп DRF рдбреЗрд╡рд▓рдкрд░ рдкреГрд╖реНрдареЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рдХрд╛рдо рдХрд┐рдпрд╛ред

рдЗрд╕рдиреЗ рдореБрдЭреЗ POST рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП SQL рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреАред

рд╕рдорд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрддрд┐рд╣рд╛рд╕ рдкреИрдирд▓ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рднреА рдкреБрд╖реНрдЯрд┐ рдХреА рд╣реИ рдХрд┐ POST рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рдФрд░ HTML рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реА рдЯреВрд▓рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред

рдпрджрд┐ рдЖрдк рдирд╡реАрдирддрдо рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрдЧ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдирдП рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред рдзрдиреНрдпрд╡рд╛рджред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

pstreck picture pstreck  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

FlipperPA picture FlipperPA  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

JoshBradshaw picture JoshBradshaw  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gw0 picture gw0  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

gosrinin picture gosrinin  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ