Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to set http request timeout in python flask

Tags:

How can I set a request timeout using Python Flask? I'm trying to compare Flask to some other framework and need to configure the timeouts to be equivalent.

Thanks!

like image 741
user2395365 Avatar asked Apr 17 '14 22:04

user2395365


People also ask

How do I set timeout on Flask?

It would be better to run your flask application on a server like Gunicorn and set the timeout there instead. This is your hook for supplying a request handler object that implements the timeout policy you want (a subject explored in this question: How to implement Timeout in BaseHTTPServer.

How do you handle request timeout?

Timeouts can be easily added to the URL you are requesting. It so happens that, you are using a third-party URL and waiting for a response. It is always a good practice to give a timeout on the URL, as we might want the URL to respond within a timespan with a response or an error.

What is HTTP response timeout?

The HyperText Transfer Protocol (HTTP) 408 Request Timeout response status code means that the server would like to shut down this unused connection. It is sent on an idle connection by some servers, even without any previous request by the client.


Video Answer


2 Answers

As Martijn Pieters said in their comment on the question, this isn't something you want to do because the Flask development server isn't a good choice for production. It would be better to run your flask application on a server like Gunicorn and set the timeout there instead.

But to answer the question anyway, Flask.run has an options parameter allowing you to pass options through to the underlying Werkzeug server:

run(host=None, port=None, debug=None, load_dotenv=True, **options) 

The relevant werkzeug method in turn has a request_handler parameter allowing you to specify what request handler is to be used:

werkzeug.serving.run_simple(hostname,     port,     application,     use_reloader=False,     use_debugger=False,     use_evalex=True,     extra_files=None,     reloader_interval=1,     reloader_type='auto',     threaded=False,     processes=1,     request_handler=None,     static_files=None,     passthrough_errors=False,     ssl_context=None ) 

This is your hook for supplying a request handler object that implements the timeout policy you want (a subject explored in this question: How to implement Timeout in BaseHTTPServer.BaseHTTPRequestHandler Python).

like image 86
Tommy Herbert Avatar answered Oct 22 '22 23:10

Tommy Herbert


WSGI server

WSGI is the protocol, a facade separating your code from the actual web server which runs it.

In the flask, you only create the logic of the server. On run, your Flask application is served by the WSGI server. The most common is uWSGI ( & nGinx proxy to the secure border between the outer world and your server). But you can use whichever WSGI server suits you best without need to change your code (nichol.as/benchmark-of-python-web-servers)*.

Flask itself ships only with the Development WSGI flask server. It means the server uses a lot of features to help the developer debug their application. These features make the server very slow. So when you do a benchmark of your app on the Development WSGI flask server, results have no value for you.

On the other hand, specialized production-ready WSGI servers (including uWSGI) are well optimized, tested and production-proven. Most of the features are usually turned off by default and allow you to fine-tune these powerful beasts for your application.

Deployment tutorials:

  • flask+wsgi: https://flask.palletsprojects.com/en/1.1.x/tutorial/deploy/
  • flask+uwsgi+nginx: http://vladikk.com/2013/09/12/serving-flask-with-nginx-on-ubuntu/

Timeout

Now when I explained the context, back to your original question. I would set requests timeout in your:

  1. test client :
import requests requests.get('https://api.myapp.com', timeout=3) <Response [200]> 
  1. nGinx proxy cofing:
http {   server   {     …     location /     {          …          proxy_read_timeout 120s;         …     }   } } 
like image 25
Ryu_CZ Avatar answered Oct 22 '22 22:10

Ryu_CZ