"объект модуля не вызывается" с официанткой
Я пытаюсь развернуть свое приложение на Heroku. Я должен использовать Windows, и Gunicorn не будет работать. Я пробовал официантку, которая выдает ошибку "модуль не вызывается" каждый раз, когда я пытаюсь загрузить любую страницу.
Примечание: я не развернул его в сети до сих пор, пытался heroku local
перед созданием общедоступного. Работает на localhost
при использовании PyCharm.
организация файлов
/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
Есть идеи, как это решить?
1 ответ
В вашем 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
правильно. @ Ответ Криса показывает, как это сделать с помощьюProcfile
. Вот еще один способ для тех, кто использует Flask:
приложение /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
в файле маршрутов, поскольку он изолирован от официантки
приложение / routes.py:
@app.route('/dothing1', methods=['POST', 'GET'])
def dothing1():
pass