PageRenderTime 33ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

/packages/debug_toolbar/middleware.py

https://gitlab.com/gregtyka/Scryve-Webapp
Python | 110 lines | 86 code | 11 blank | 13 comment | 13 complexity | a3d42af02b994a8542e485697795e83e MD5 | raw file
  1. """
  2. Debug Toolbar middleware
  3. """
  4. import os
  5. from django.conf import settings
  6. from django.http import HttpResponseRedirect
  7. from django.shortcuts import render_to_response
  8. from django.utils.encoding import smart_unicode
  9. from django.conf.urls.defaults import include, patterns
  10. import debug_toolbar.urls
  11. from debug_toolbar.toolbar.loader import DebugToolbar
  12. _HTML_TYPES = ('text/html', 'application/xhtml+xml')
  13. def replace_insensitive(string, target, replacement):
  14. """
  15. Similar to string.replace() but is case insensitive
  16. Code borrowed from: http://forums.devshed.com/python-programming-11/case-insensitive-string-replace-490921.html
  17. """
  18. no_case = string.lower()
  19. index = no_case.rfind(target.lower())
  20. if index >= 0:
  21. return string[:index] + replacement + string[index + len(target):]
  22. else: # no results so return the original string
  23. return string
  24. class DebugToolbarMiddleware(object):
  25. """
  26. Middleware to set up Debug Toolbar on incoming request and render toolbar
  27. on outgoing response.
  28. """
  29. def __init__(self):
  30. self.debug_toolbars = {}
  31. self.override_url = True
  32. # Set method to use to decide to show toolbar
  33. self.show_toolbar = self._show_toolbar # default
  34. # The tag to attach the toolbar to
  35. self.tag= u'</body>'
  36. if hasattr(settings, 'DEBUG_TOOLBAR_CONFIG'):
  37. show_toolbar_callback = settings.DEBUG_TOOLBAR_CONFIG.get(
  38. 'SHOW_TOOLBAR_CALLBACK', None)
  39. if show_toolbar_callback:
  40. self.show_toolbar = show_toolbar_callback
  41. tag = settings.DEBUG_TOOLBAR_CONFIG.get('TAG', None)
  42. if tag:
  43. self.tag = u'</' + tag + u'>'
  44. def _show_toolbar(self, request):
  45. x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR', None)
  46. if x_forwarded_for:
  47. remote_addr = x_forwarded_for.split(',')[0].strip()
  48. else:
  49. remote_addr = request.META.get('REMOTE_ADDR', None)
  50. if not remote_addr in settings.INTERNAL_IPS \
  51. or (request.is_ajax() and \
  52. not debug_toolbar.urls._PREFIX in request.path) \
  53. or not settings.DEBUG:
  54. return False
  55. return True
  56. def process_request(self, request):
  57. if self.show_toolbar(request):
  58. if self.override_url:
  59. original_urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF)
  60. debug_toolbar.urls.urlpatterns += patterns('',
  61. ('', include(original_urlconf)),
  62. )
  63. self.override_url = False
  64. request.urlconf = 'debug_toolbar.urls'
  65. self.debug_toolbars[request] = DebugToolbar(request)
  66. for panel in self.debug_toolbars[request].panels:
  67. panel.process_request(request)
  68. def process_view(self, request, view_func, view_args, view_kwargs):
  69. if request in self.debug_toolbars:
  70. for panel in self.debug_toolbars[request].panels:
  71. panel.process_view(request, view_func, view_args, view_kwargs)
  72. def process_response(self, request, response):
  73. if request not in self.debug_toolbars:
  74. return response
  75. if self.debug_toolbars[request].config['INTERCEPT_REDIRECTS']:
  76. if isinstance(response, HttpResponseRedirect):
  77. redirect_to = response.get('Location', None)
  78. if redirect_to:
  79. cookies = response.cookies
  80. response = render_to_response(
  81. 'debug_toolbar/redirect.html',
  82. {'redirect_to': redirect_to}
  83. )
  84. response.cookies = cookies
  85. if response.status_code == 200:
  86. for panel in self.debug_toolbars[request].panels:
  87. panel.process_response(request, response)
  88. if response['Content-Type'].split(';')[0] in _HTML_TYPES:
  89. response.content = replace_insensitive(
  90. smart_unicode(response.content),
  91. self.tag,
  92. smart_unicode(self.debug_toolbars[request].render_toolbar() + self.tag))
  93. if response.get('Content-Length', None):
  94. response['Content-Length'] = len(response.content)
  95. del self.debug_toolbars[request]
  96. return response