Reputation: 3155
I cannot run gunicorn on heroku with simple flask app.
The application is really simple. This is app.py:
app = Flask(__name__)
@app.route("/")
def say_hello(url):
return "Hello"
if __name__ == "__main__":
port = int(os.environ.get('PORT', 8888))
app.run(host='0.0.0.0',port=port)
The app works fine through flask test server on heroku, but when I switch to use gunicorn, it crashes with:
ImportError: No module named app.wsgiapp
My requirements.txt:
Flask==0.8
gevent==0.13.7
gunicorn==0.13.2
I've tried different versions of gunicorn from 0.13.7 to 0.14.6 with no success.
Procfile:
web: gunicorn app:app -w 4 -b 0.0.0.0:$PORT
Running this command:
heroku logs
gives this:
←[33m2012-08-09T21:08:02+00:00 app[web.1]:←[0m ImportError: No module named app.
wsgiapp ←[33m2012-08-09T21:08:02+00:00 app[web.1]:←[0m entry = __import__(self.modul
e_name, globals(),globals(), ['__name__'])
Any help please?
Upvotes: 14
Views: 7898
Reputation: 7093
I ran into this problem when upgrading Ubuntu to 14.04 LTS.
For some reason, gunicorn
failed to pick up the correct python path to resolve the wsgi module.
I resolved this, for now, by declaring the python path explicitly to gunicorn
via the --pythonpath
parameter (documented here).
For example:
gunicorn --pythonpath /path/to/containing/directory "app.wsgi_app:wsgi_app"
Upvotes: 4
Reputation: 131
In my case, I got this error by having a gunicorn.py
file in my top level folder. This clashed with the installed gunicorn library on Heroku.
So my run command that caused the problem was:
gunicorn -c gunicorn.py myapp:main
Raising the following error:
Traceback (most recent call last):
File "/app/.heroku/python/bin/gunicorn", line 9, in <module>
load_entry_point('gunicorn==18.0', 'console_scripts', 'gunicorn')()
File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point
return get_distribution(dist).load_entry_point(group, name)
File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point
return ep.load()
File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
entry = __import__(self.module_name, globals(),globals(), ['__name__'])
ImportError: No module named app.wsgiapp
Whereas after a mv gunicorn.py gunicorn_config.py
it worked fine with:
gunicorn -c gunicorn_config.py myapp:main
Upvotes: 11
Reputation: 1194
I finally figured this one out.
It's basically just a PATH problem. If you import certain modules (like os and sys) in the wrong order depending on your setup, you will cause Gunicorn to look in the wrong package for the app.wsgiapp module. (not to be confused with the app.wsgi_app function in Flask)
The correct import order will vary depending on your setup, but the rule of thumb based on what I was able to get working was to just make sure that your sys module is imported before your os module.
Beyond that, assuming the rest of the config is normal (as above) you shouldn't have any issues.
Note: THIS IS ONLY A PROBLEM ON HEROKU with Gunicorn. It has something to do with how their PYTHONPATH and module search path is set up. I don't know why exactly, but this is only necessary for the production environment, local setups will work fine regardless of the module import order.
Upvotes: 3
Reputation: 739
My guess is there is an other "app" module in the python path (both gunicorn and flask have a module called app already). Rename it anything else than app.py and it should work.
Upvotes: 1