Code

Ticket #15249: inline-debug.diff

File inline-debug.diff, 3.0 KB (added by lxsameer, 3 years ago)
Line 
1Index: django/conf/global_settings.py
2===================================================================
3--- django/conf/global_settings.py      (revision 15477)
4+++ django/conf/global_settings.py      (working copy)
5@@ -583,3 +583,11 @@
6 # Make sure to use a trailing slash.
7 # Examples: "http://foo.com/static/admin/", "/static/admin/".
8 ADMIN_MEDIA_PREFIX = '/static/admin/'
9+
10+# Run ipython or python interactive shell when
11+# an uncaught exception occure, if set to "interactive"
12+# run pdb debugger when an uncaught exception raised,
13+# if set to "pdb"
14+# any other value is not valid
15+
16+INLINE_DEBUGGER = None
17Index: django/core/handlers/base.py
18===================================================================
19--- django/core/handlers/base.py        (revision 15477)
20+++ django/core/handlers/base.py        (working copy)
21@@ -9,6 +9,10 @@
22 logger = getLogger('django.request')
23 
24 
25+class WrongValue (Exception):
26+    pass
27+
28+
29 class BaseHandler(object):
30     # Changes that are always applied to a response (in this order).
31     response_fixes = [
32@@ -199,6 +203,45 @@
33             raise
34 
35         if settings.DEBUG:
36+            # Run an interactive shell or pdb when an uncaught exception
37+            # raised. if INLINE_DEBUGGER defined.
38+            if not exc_info[0] == SyntaxError:
39+                if settings.INLINE_DEBUGGER:
40+                    if settings.INLINE_DEBUGGER == "interactive":
41+                        tbtmp = exc_info[-1]
42+                        tb = None
43+                        while tbtmp:
44+                            tbtmp = tbtmp.tb_next
45+                            if tbtmp is not None:
46+                                tb = tbtmp
47+                        import traceback
48+                        print
49+                        traceback.print_exception(*exc_info)
50+
51+                        try:
52+                            from IPython import Shell
53+                            ipshell = Shell.start()
54+                            ipshell.IP.api.to_user_ns(tb.tb_frame.f_locals)
55+                            ipshell.IP.api.to_user_ns(tb.tb_frame.f_globals)
56+                            ipshell.mainloop()
57+
58+                        except ImportError:
59+                            import code
60+                            shell = code.InteractiveConsole(tb.tb_frame.f_locals)
61+                            shell.interact()
62+
63+                    elif settings.INLINE_DEBUGGER == "pdb":
64+                        import pdb
65+                        import traceback
66+                        print
67+                        traceback.print_exception(*exc_info)
68+                        pdb.post_mortem(exc_info[-1])
69+                    else:
70+                        exception = WrongValue("'%s'is invalid value for'setting.INLINE_DEBUGGER'. Use 'pdb' or 'interactive' instead." % \
71+                                               settings.INLINE_DEBUGGER)
72+                        exc_info = (type(exception), exception, None)
73+
74+
75             from django.views import debug
76             return debug.technical_500_response(request, *exc_info)
77