from__future__importwith_statementimportcProfileimportpstatsimportcgiimportpprintimportthreadingfromStringIOimportStringIOclassProfilingMiddleware(object):def__init__(self,app):self.lock=threading.Lock()self.app=appdef__call__(self,environ,start_response):withself.lock:profiler=cProfile.Profile()defrun_app(*a,**kw):self.response=self.app(environ,start_response)profiler.runcall(run_app,environ,start_response)profiler.snapshot_stats()stats=pstats.Stats(profiler)stats.sort_stats('cumulative')# Redirect outputout=StringIO()stats.stream=outstats.print_stats()resp=''.join(self.response)# Lets at least only put this on html-like responses.ifresp.strip().startswith('<'):## The profiling info is just appended to the response.## Browsers don't mind this.resp+='<pre style="text-align:left; border-top: 4px dashed red; padding: 1em;">'resp+=cgi.escape(out.getvalue(),True)output=StringIO()pprint.pprint(environ,output,depth=3)resp+=cgi.escape(output.getvalue(),True)resp+='</pre>'returnresp