1from django.http import Http404 2from django.urls import resolve 3from django.utils.translation import gettext_lazy as _ 4 5from debug_toolbar.panels import Panel 6from debug_toolbar.utils import get_name_from_obj, get_sorted_request_variable 7 8 9class RequestPanel(Panel): 10 """ 11 A panel to display request variables (POST/GET, session, cookies). 12 """ 13 14 template = "debug_toolbar/panels/request.html" 15 16 title = _("Request") 17 18 @property 19 def nav_subtitle(self): 20 """ 21 Show abbreviated name of view function as subtitle 22 """ 23 view_func = self.get_stats().get("view_func", "") 24 return view_func.rsplit(".", 1)[-1] 25 26 def generate_stats(self, request, response): 27 self.record_stats( 28 { 29 "get": get_sorted_request_variable(request.GET), 30 "post": get_sorted_request_variable(request.POST), 31 "cookies": get_sorted_request_variable(request.COOKIES), 32 } 33 ) 34 35 view_info = { 36 "view_func": _("<no view>"), 37 "view_args": "None", 38 "view_kwargs": "None", 39 "view_urlname": "None", 40 } 41 try: 42 match = resolve(request.path) 43 func, args, kwargs = match 44 view_info["view_func"] = get_name_from_obj(func) 45 view_info["view_args"] = args 46 view_info["view_kwargs"] = kwargs 47 48 if getattr(match, "url_name", False): 49 url_name = match.url_name 50 if match.namespaces: 51 url_name = ":".join([*match.namespaces, url_name]) 52 else: 53 url_name = _("<unavailable>") 54 55 view_info["view_urlname"] = url_name 56 57 except Http404: 58 pass 59 self.record_stats(view_info) 60 61 if hasattr(request, "session"): 62 self.record_stats( 63 { 64 "session": [ 65 (k, request.session.get(k)) 66 for k in sorted(request.session.keys()) 67 ] 68 } 69 ) 70