Application Profiler

This module provides a middleware that profiles each request with the cProfile module. This can help identify bottlenecks in your code that may be slowing down your application.

class werkzeug.middleware.profiler.ProfilerMiddleware(app, stream=sys.stdout, sort_by=('time', 'calls'), restrictions=(), profile_dir=None, filename_format='{method}.{path}.{elapsed:.0f}ms.{time:.0f}.prof')

Wrap a WSGI application and profile the execution of each request. Responses are buffered so that timings are more exact.

If stream is given, pstats.Stats are written to it after each request. If profile_dir is given, cProfile data files are saved to that directory, one file per request.

The filename can be customized by passing filename_format. If it is a string, it will be formatted using str.format() with the following fields available:

  • {method} - The request method; GET, POST, etc.

  • {path} - The request path or ‘root’ should one not exist.

  • {elapsed} - The elapsed time of the request in milliseconds.

  • {time} - The time of the request.

If it is a callable, it will be called with the WSGI environ and be expected to return a filename string. The environ dictionary will also have the "werkzeug.profiler" key populated with a dictionary containing the following fields (more may be added in the future): - {elapsed} - The elapsed time of the request in milliseconds. - {time} - The time of the request.

  • app (WSGIApplication) – The WSGI application to wrap.

  • stream (t.IO[str] | None) – Write stats to this stream. Disable with None.

  • sort_by (t.Iterable[str]) – A tuple of columns to sort stats by. See pstats.Stats.sort_stats().

  • restrictions (t.Iterable[str | int | float]) – A tuple of restrictions to filter stats by. See pstats.Stats.print_stats().

  • profile_dir (str | None) – Save profile data files to this directory.

  • filename_format (str) – Format string for profile data file names, or a callable returning a name. See explanation above.

from werkzeug.middleware.profiler import ProfilerMiddleware
app = ProfilerMiddleware(app)

Changed in version 3.0: Added the "werkzeug.profiler" key to the filename_format(environ) parameter with the elapsed and time fields.


Changed in version 0.15: Stats are written even if profile_dir is given, and can be disable by passing stream=None.

New in version 0.15: Added filename_format.

New in version 0.9: Added restrictions and profile_dir.