Last active
July 25, 2022 12:22
-
-
Save jaytaylor/5457210 to your computer and use it in GitHub Desktop.
MyFancyRequestHandler extends the werkzeug BaseRequestHandler to provide HTTP request execution time to the server log. NB: The associated tutorial is: http://jaytaylor.com/blog/?p=305
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
from werkzeug.serving import BaseRequestHandler | |
class MyFancyRequestHandler(BaseRequestHandler): | |
"""Extend werkzeug request handler to suit our needs.""" | |
def handle(self): | |
self.fancyStarted = time.time() | |
rv = super(MyFancyRequestHandler, self).handle() | |
return rv | |
def send_response(self, *args, **kw): | |
self.fancyProcessed = time.time() | |
super(MyFancyRequestHandler, self).send_response(*args, **kw) | |
def log_request(self, code='-', size='-'): | |
duration = int((self.fancyProcessed - self.fancyStarted) * 1000) | |
self.log('info', '"{0}" {1} {2} [{3}ms]'.format(self.requestline, code, size, duration)) |
Like @noise, I'm trying to accomplish this from gunicorn, which doesn't app.run. The Heroku Procfile doesn't help either. There doesn't seem to be a way to set this handler after/before the call to run.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks, this was very timely for me as I just did the same thing with a secondary log using @before_request and @after_request, but this is more what I was looking for - directly appending to the access.log entries.
However, I'm trying to figure out how to override the request handler in a hosted wsgi situation where app.run() is not called directly by my code. Flask does not appear to have a way to pass in werkzeug options to the Flask() constructor. Any ideas on how to tackle that?