Search code examples
pythonpython-3.xgunicornbottle

Bottle App gives Internal Server Error when accessing default page


I am just getting started with Bottle. I have a sample app on GitHub. The main module app.py (in the Application folder) looks like below

"""
This script runs the application using a development server.
"""

import bottle
import os
import sys

# routes contains the HTTP handlers for our server and must be imported.
import routes

if '--debug' in sys.argv[1:] or 'SERVER_DEBUG' in os.environ:
    # Debug mode will enable more verbose output in the console window.
    # It must be set at the beginning of the script.
    bottle.debug(True)

def wsgi_app():
    """Returns the application to make available through wfastcgi. This is used
    when the site is published to Microsoft Azure."""
    return bottle.default_app()

if __name__ == '__main__':
    PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
    STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static').replace('\\', '/')
    HOST = os.environ.get('SERVER_HOST', 'localhost')
    try:
        PORT = int(os.environ.get('SERVER_PORT', '5555'))
    except ValueError:
        PORT = 5555

    @bottle.route('/static/<filepath:path>')
    def server_static(filepath):
        """Handler for static files, used with the development server.
        When running under a production server such as IIS or Apache,
        the server should be configured to serve the static files."""
        return bottle.static_file(filepath, root=STATIC_ROOT)

    # Starts a local test server.
    bottle.run(server='wsgiref', host=HOST, port=PORT)

The requirements.txt file has

bottle
gunicorn

as dependencies. I am using Python 3.7.2. After running pip install -r requirements.txt,

I ran python app.py. The server starts up and I can access the default page without error error

I tried running the server using gunicorn as below

gunicorn -w 2 -b 0.0.0.0:8080 app:wsgi_app    

The server starts up fine, but when I access the default page, I get

Traceback (most recent call last):
  File "/Users/<user>/Codebase/test-bottle/venv/lib/python3.8/site-packages/gunicorn/workers/sync.py", line 134, in handle
    self.handle_request(listener, req, client, addr)
  File "/Users/<user>/Codebase/test-bottle/venv/lib/python3.8/site-packages/gunicorn/workers/sync.py", line 175, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
TypeError: wsgi_app() takes 0 positional arguments but 2 were given

Please let me know what I've done wrong.


Solution

  • You can run the app without modifying the code using the “application factory” pattern (as stated in the gunicorn documentation):

    gunicorn -w 2 -b 0.0.0.0:8080 'app:wsgi_app()'
    

    Please note, that your page will not display fully, thought. The static links, e.g. css, will not load, since you are not defining any routes in your code in this case:

    def wsgi_app():
        """Returns the application to make available through wfastcgi. This is used
        when the site is published to Microsoft Azure."""
        return bottle.default_app()