Waitress serve takes too long to run flask server

Question:

I am trying to run a flask app with waitress serve, but when i call "python app.py" nothing happens (i waited 2 minutes then ctrl+c). When i run flask with app.run() everything works normally. Some help would be appreciated

import Flask
from waitress import serve

app=Flask(__name__)
<My code>
if __name__ == "__main__":
  serve(app,port="8080",host="0.0.0.0")
Asked By: Matias

||

Answers:

Create a method called create_app() for example which returns the Flask object.
You can add a route if you wish.

from flask import Flask

def create_app():
    app = Flask(__name__)

    @app.route('/')
    def hello_world():
      return 'Hello World!'
    return app

if your file is called app.py
run the following command.

waitress-serve --port 8080 --call "app:create_app"

Output:

INFO:waitress:Serving on http://0.0.0.0:8080

Edit


If you really want to do it with waitress.serve() you can do this. For some reason this only works on localhost (127.0.0.1)

With your code the server starts and is accessable (the only thing you need are some routes) the only thing that is missing is terminal output.

You can activate logging like this:

import logging
logger = logging.getLogger('waitress')
logger.setLevel(logging.INFO)

This causes the output:

INFO:waitress:Serving on http://127.0.0.1:8080

If you want to see every request:
install paste pip install paste and use TransLogger

from paste.translogger import TransLogger
# modify serve function
serve(TransLogger(app, setup_console_handler=False), host='127.0.0.1', port=8080)

This causes the following output on every request.

INFO:wsgi:127.0.0.1 - - [21/Jul/2022:15:40:25 +0200] "GET / HTTP/1.1" 200 12 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"

Of course this depends on your browser.

Full code:

from flask import Flask
from waitress import serve
from paste.translogger import TransLogger
import logging
logger = logging.getLogger('waitress')
logger.setLevel(logging.INFO)

app = Flask(__name__)

@app.route('/')
def hello():
  return 'Hello World!'


serve(TransLogger(app, setup_console_handler=False), host='127.0.0.1', port=8080)
Answered By: noah1400
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.