##// END OF EJS Templates
Complete copyright notices for web interface; change footer to link to them....
Complete copyright notices for web interface; change footer to link to them. The original copyright notice found in the footer was not accurate as it included only one of the many copyright holders in this project. This change creates an "about" page, which currently contains just the copyright and license information. It links to repository for additional potential copyright holders not listed on the about page. Unlisted contributors are mentioned in template comments. Html links for Kallithea is fixed and we link to Conservancy. Display of version information in the footer is improved.

File last commit:

r2215:2c2bdaec codereview
r4178:9dd72670 kallithea-2.2.5-r...
Show More
profiler.py
60 lines | 1.6 KiB | text/x-python | PythonLexer
from __future__ import with_statement
import gc
import objgraph
import cProfile
import pstats
import cgi
import pprint
import threading
from StringIO import StringIO
class ProfilingMiddleware(object):
def __init__(self, app):
self.lock = threading.Lock()
self.app = app
def __call__(self, environ, start_response):
with self.lock:
profiler = cProfile.Profile()
def run_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 output
out = StringIO()
stats.stream = out
stats.print_stats()
resp = ''.join(self.response)
# Lets at least only put this on html-like responses.
if resp.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()
print ct
resp += ct if ct else '---'
output = StringIO()
pprint.pprint(environ, output, depth=3)
resp += cgi.escape(output.getvalue(), True)
resp += '</pre>'
return resp