рдирдорд╕реНрддреЗ, рдореИрдВ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрд╣рд╛рдВ POST
рдЕрдиреБрд░реЛрдз рдЯреВрд▓рдмрд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХрд┐рд╕реА рдЕрдиреНрдп GET
рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП, рдбреАрдмрдЧ рдЯреВрд▓рдмрд╛рд░ рдареАрдХ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдРрд╕рд╛ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рдЙрдкрдХрд░рдг рдкрдЯреНрдЯреА рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдпрджрд┐ рдпрд╣ рд╕рдорд░реНрдерд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдХреЗрд╡рд▓ django рдЖрд░рд╛рдо рдврд╛рдВрдЪреЗ рд╕реЗ ViewSets
, ModelViewSet
рдЕрдиреБрд░реЛрдз рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?
рдореИрдВ рдпрд╣рд╛рдВ 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 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реА рдЯреВрд▓рдмрд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред
рдпрджрд┐ рдЖрдк рдирд╡реАрдирддрдо рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрдЧ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдирдП рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реЗрдВред рдзрдиреНрдпрд╡рд╛рджред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдЕрдкрдиреЗ Django рдбреАрдмрдЧ рдЯреВрд▓рдмрд╛рд░ рдХреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ _before_ рдЙрд╕ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред