from__future__importwith_statementimportgcimportobjgraphimportcProfileimportpstatsimportcgiimportpprintimportthreadingfromStringIOimportStringIOclassProfilingMiddleware(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('calls')#cummulative# 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)ct=objgraph.show_most_common_types()printctresp+=ctifctelse'---'output=StringIO()pprint.pprint(environ,output,depth=3)resp+=cgi.escape(output.getvalue(),True)resp+='</pre>'returnresp