-
-
Save lost-theory/4521102 to your computer and use it in GitHub Desktop.
| import time | |
| from flask import Flask, request, g, render_template | |
| app = Flask(__name__) | |
| app.config['DEBUG'] = True | |
| @app.before_request | |
| def before_request(): | |
| g.request_start_time = time.time() | |
| g.request_time = lambda: "%.5fs" % (time.time() - g.request_start_time) | |
| @app.route("/") | |
| def index(): | |
| t = request.values.get('t', 0) | |
| time.sleep(float(t)) #just to show it works... | |
| return render_template("index.html") | |
| if __name__ == "__main__": | |
| app.run(use_debugger=True, use_reloader=True) |
| Rendered in {{ g.request_time() }} |
| $ curl http://127.0.0.1:5000/ | |
| Rendered in 0.00100s | |
| $ curl http://127.0.0.1:5000/?t=1 | |
| Rendered in 1.00106s | |
| $ curl http://127.0.0.1:5000/?t=2 | |
| Rendered in 2.00111s | |
| $ curl http://127.0.0.1:5000/?t=10 | |
| Rendered in 10.00057s |
Given the lambda can capture the scope variables, you could simplify this to:
@app.before_request
def before_request():
request_start_time = time.time()
g.request_time = lambda: "%.5fs" % (time.time() - request_start_time)
unless, of course you want the request_start_time to be queryable separately
Great, didn't know there's such thing as before_request and after_request, thank you :)
Cool solution, just one small thing to pay attention to when your measuring performance:
If you call {{ g.request_time() }} at the start of your html template, and then do a whole bunch of rendering, the time will be off. I had up to a factor of 20x speed difference, and couldn't figure out why, and this was the reason. My solution was to put this small snippet at the button of the template:
...
<p id="request_time_paragraph"></p>
do_some_heavy_rendering()
<script>
document.getElementById('request_time_paragraph').innerHTML = "{{ g.request_time() }}"
</script>
You’ll want to use time.monotonic() for correctness :)
Otherwise, you end up with weird negative page rendering times during leap seconds :)
I got jinja2.exceptions.TemplateNotFound
please resolve this
@mallikharjuna160003 To resolve this error just create a directory "templates" and put the required html files in.
@chrickso, that line just creates a function that returns the time since
before_requestwas called. The function is called later when the template is rendered (inindex.html) which happens after the request has completed.