Yes, Flask is a WSGI application, so it is trivial to wrap your app in an extra layer that logs the request:
import pprint
class LoggingMiddleware(object):
def __init__(self, app):
self._app = app
def __call__(self, env, resp):
errorlog = env['wsgi.errors']
pprint.pprint(('REQUEST', env), stream=errorlog)
def log_response(status, headers, *args):
pprint.pprint(('RESPONSE', status, headers), stream=errorlog)
return resp(status, headers, *args)
return self._app(env, log_response)
This defines a piece of middleware to wrap your Flask application in. The advantage is that it operates entirely independent of Flask, giving you unfiltered insight into what goes in and what comes out.
How you apply the middleware depends on the exact WSGI server you are using; see your WSGI server documentation.
When running Flask with the built-in server (app.run()
), do:
if __name__ == '__main__':
app.wsgi_app = LoggingMiddleware(app.wsgi_app)
app.run()
The little app.wsgi_app
wrapping dance places the LoggingMiddleware
around the Flask WSGI application.
The output goes to the wsgi.error
stream; where that ends up again depends on your WSGI server; mod_wsgi
puts this in the Apache error log for your site, the bundled Flask server prints this to stderr
.
all the HTTP details
as specified. Using other properties of request also doesn't help (e.g. data, form, values, etc). To print the HTTP request in its entirety, wrapping around WSGI suggested in @martinpieters' answer is the way to go. – Lickerish