I am trying to deploy my app on Heroku. I have to use Windows, and gunicorn won't work. I tried waitress, which keeps giving me a "module not callable" error whenever I try to load any page.
Note: I haven't deployed it on web so far, was trying heroku local
before creating a publicly accessible one. It works on localhost
when using PyCharm.
organization of files
/myapp
requirements.txt
Procfile
/myapp
/static
/templates
__init__.py
__init __.py
:
# encoding=utf-8
import click
from myapp.application import create_app
from myapp.application import db, login_manager
app = create_app()
from myapp.config import SQLALCHEMY_TRACK_MODIFICATIONS
from myapp.models import User
from myapp.views import *
app.add_url_rule('/home', HomePage.endpoint,
view_func=HomePage.as_view(HomePage.endpoint), methods=['GET','POST'])
# pages are defined in views.py
#other code
if __name__ == '__main__':
# set debug to false when moving to production
app.run()
Procfile
:
web: waitress-serve --port=5000 myapp:application
traceback:
\myapp>heroku local
[WARN] No ENV file found
14:58:51 web.1 | ERROR:waitress:Exception when serving /home
14:58:51 web.1 | Traceback (most recent call last):
14:58:51 web.1 | File "c:\python34\lib\site-packages\waitress\channel.py",
line 338, in service
14:58:51 web.1 | task.service()
14:58:51 web.1 | File "c:\python34\lib\site-packages\waitress\task.py", lin
e 169, in service
14:58:51 web.1 | self.execute()
14:58:51 web.1 | File "c:\python34\lib\site-packages\waitress\task.py", lin
e 399, in execute
14:58:51 web.1 | app_iter = self.channel.server.application(env, start_re
sponse)
14:58:51 web.1 | TypeError: 'module' object is not callable
14:58:51 web.1 | ERROR:waitress:Exception when serving /favicon.ico
14:58:51 web.1 | Traceback (most recent call last):
14:58:51 web.1 | File "c:\python34\lib\site-packages\waitress\channel.py",
line 338, in service
14:58:51 web.1 | task.service()
14:58:51 web.1 | File "c:\python34\lib\site-packages\waitress\task.py", lin
e 169, in service
14:58:51 web.1 | self.execute()
14:58:51 web.1 | File "c:\python34\lib\site-packages\waitress\task.py", lin
e 399, in execute
14:58:51 web.1 | app_iter = self.channel.server.application(env, start_re
sponse)
14:58:51 web.1 | TypeError: 'module' object is not callable
Any idea how to solve this?
In your Procfile
, try changing
web: waitress-serve --port=5000 myapp:application
to
web: waitress-serve --port=5000 myapp:app
The last argument to waitress-serve
is MODULE:OBJECT
, where OBJECT
is the application object in MODULE
. Here, you've named your application app
:
app = create_app()
(You're not showing us all of your code, but it looks like myapp.application
is in fact a module, not an object. You import create_app
, db
, and login_manager
from it in your sample code.)