"module object not callable" 与女服务员
"module object not callable" with Waitress
我正在尝试在 Heroku 上部署我的应用程序。我必须使用 Windows,而 gunicorn 将无法工作。我试过女服务员,每当我尝试加载任何页面时,它都会给我一个 "module not callable" 错误。
注意:到目前为止我还没有在网络上部署它,在创建一个可公开访问的之前尝试 heroku local
。使用 PyCharm.
时,它适用于 localhost
文件组织
/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
回溯:
\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
知道如何解决这个问题吗?
在您的 Procfile
中,尝试更改
web: waitress-serve --port=5000 myapp:application
至
web: waitress-serve --port=5000 myapp:app
waitress-serve
的最后一个参数是 MODULE:OBJECT
,其中 OBJECT
是 MODULE
中的应用程序对象。在这里,您已将应用程序命名为 app
:
app = create_app()
(您没有向我们展示您的所有代码,但看起来 myapp.application
实际上是一个模块,而不是对象。您导入 create_app
、db
,以及示例代码中的 login_manager
。)
女服务员有自己的app
,所以您需要正确区分您的app
。 @Chris 的回答向您展示了如何通过 Procfile
这样做。对于那些使用 Flask 的人来说,这是另一种方式:
app/init.py:
from flask import Flask
app = Flask(__name__, template_folder="some path", static_folder="another path")
main.py
from waitress import serve
from app import app as my_app # renamed to distinguish from waitress' 'app'
if __name__ == "__main__":
serve(my_app, host="localhost", port=5005)
这允许您将名为 app
的应用保留在路由文件中,因为它与女服务员隔离开来
app/routes.py:
@app.route('/dothing1', methods=['POST', 'GET'])
def dothing1():
pass
我正在尝试在 Heroku 上部署我的应用程序。我必须使用 Windows,而 gunicorn 将无法工作。我试过女服务员,每当我尝试加载任何页面时,它都会给我一个 "module not callable" 错误。
注意:到目前为止我还没有在网络上部署它,在创建一个可公开访问的之前尝试 heroku local
。使用 PyCharm.
localhost
文件组织
/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
回溯:
\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
知道如何解决这个问题吗?
在您的 Procfile
中,尝试更改
web: waitress-serve --port=5000 myapp:application
至
web: waitress-serve --port=5000 myapp:app
waitress-serve
的最后一个参数是 MODULE:OBJECT
,其中 OBJECT
是 MODULE
中的应用程序对象。在这里,您已将应用程序命名为 app
:
app = create_app()
(您没有向我们展示您的所有代码,但看起来 myapp.application
实际上是一个模块,而不是对象。您导入 create_app
、db
,以及示例代码中的 login_manager
。)
女服务员有自己的app
,所以您需要正确区分您的app
。 @Chris 的回答向您展示了如何通过 Procfile
这样做。对于那些使用 Flask 的人来说,这是另一种方式:
app/init.py:
from flask import Flask
app = Flask(__name__, template_folder="some path", static_folder="another path")
main.py
from waitress import serve
from app import app as my_app # renamed to distinguish from waitress' 'app'
if __name__ == "__main__":
serve(my_app, host="localhost", port=5005)
这允许您将名为 app
的应用保留在路由文件中,因为它与女服务员隔离开来
app/routes.py:
@app.route('/dothing1', methods=['POST', 'GET'])
def dothing1():
pass