Сбой при развертывании Heroku / Flask: «Не удается найти приложение атрибута» или «Не удается найти имя модуля (flask_module)», виноват pro c файл? - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь развернуть приложение Flask на heroku, и я подозреваю, что, возможно, виноват Procfile. Я не уверен, правильно ли я написал, и, как и многим другим пользователям stackoverflow, мне было трудно найти документацию, чтобы уточнить, каким должен быть синтаксис Procfile. Я использую gunicorn, потому что учебники, кажется, рекомендуют его.

Во-первых, экранная крышка моего дерева файлов для этого Flask приложения ...

enter image description here

Поправьте меня, если я ошибаюсь, но я считаю, что мой flask модуль приложения должен иметь имя Neuroethics_Behavioral_Task или имя каталога root ... Также файл experiment.py совпадает с app.py в большинстве flask учебных пособий.

Сначала мой procfile выглядел так:

web: gunicorn experiment:app

Это фрагмент вывода, созданного лог-файлом, я я не уверен, нужно ли мне на самом деле включать все. изменил мой procfile на следующий

web: gunicorn Neuroethics_Behavioral_Task.experiment:app

Попытка развернуть это на heroku привела к следующему в моем лог-файле. Опять же, я только отправляю фрагмент кода.

2020-01-29T22:04:04.569529+00:00 app[web.1]: ModuleNotFoundError: No module named 'Neuroethics_Behavioral_Task'
2020-01-29T22:04:04.569692+00:00 app[web.1]: [2020-01-29 22:04:04 +0000] [11] [INFO] Worker exiting (pid: 11)
2020-01-29T22:04:04.690072+00:00 app[web.1]: [2020-01-29 22:04:04 +0000] [4] [INFO] Shutting down: Master
2020-01-29T22:04:04.690264+00:00 app[web.1]: [2020-01-29 22:04:04 +0000] [4] [INFO] Reason: Worker failed to bo ot.
                 2020-01-29T22:12:52.569782+00:00 heroku[web.1]: State changed from crashed to starting
2020-01-29T22:12:59.200397+00:00 heroku[web.1]: Starting process with command `gunicorn Neuroethics_Behavioral_Task.experiment:app`
2020-01-29T22:13:03.010772+00:00 heroku[web.1]: State changed from starting to crashed
2020-01-29T22:13:02.559827+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [4] [INFO] Starting gunicorn 20.0.4
2020-01-29T22:13:02.561033+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [4] [INFO] Listening at: http://0.0.0.0:25539 (4)
2020-01-29T22:13:02.561235+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [4] [INFO] Using worker: sync
2020-01-29T22:13:02.568896+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [10] [INFO] Booting worker with pid: 10
2020-01-29T22:13:02.588814+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [10] [ERROR] Exception in worker process
2020-01-29T22:13:02.588821+00:00 app[web.1]: Traceback (most recent call last):
2020-01-29T22:13:02.588824+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
2020-01-29T22:13:02.588827+00:00 app[web.1]: worker.init_process()
2020-01-29T22:13:02.588829+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 119, in init_process
2020-01-29T22:13:02.588831+00:00 app[web.1]: self.load_wsgi()
2020-01-29T22:13:02.588833+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
2020-01-29T22:13:02.588835+00:00 app[web.1]: self.wsgi = self.app.wsgi()
2020-01-29T22:13:02.588837+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
2020-01-29T22:13:02.588839+00:00 app[web.1]: self.callable = self.load()
2020-01-29T22:13:02.588841+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
2020-01-29T22:13:02.588843+00:00 app[web.1]: return self.load_wsgiapp()
2020-01-29T22:13:02.588845+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
2020-01-29T22:13:02.588847+00:00 app[web.1]: return util.import_app(self.app_uri)
2020-01-29T22:13:02.588849+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/util.py", line 358, in import_app
2020-01-29T22:13:02.588851+00:00 app[web.1]: mod = importlib.import_module(module)
2020-01-29T22:13:02.588853+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/importlib/__init__.py", line 126, in import_module
2020-01-29T22:13:02.588855+00:00 app[web.1]: return _bootstrap._gcd_import(name[level:], package, level)
2020-01-29T22:13:02.588858+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 994, in _gcd_import
2020-01-29T22:13:02.588860+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 971, in _find_and_load
2020-01-29T22:13:02.588862+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
2020-01-29T22:13:02.588863+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
2020-01-29T22:13:02.588866+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 994, in _gcd_import
2020-01-29T22:13:02.588868+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 971, in _find_and_load
2020-01-29T22:13:02.588870+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
2020-01-29T22:13:02.593430+00:00 app[web.1]: ModuleNotFoundError: No module named 'Neuroethics_Behavioral_Task'
2020-01-29T22:13:02.593748+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [10] [INFO] Worker exiting (pid: 10)
2020-01-29T22:13:02.617045+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [11] [INFO] Booting worker with pid: 11
2020-01-29T22:13:02.650580+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [11] [ERROR] Exception in worker process
2020-01-29T22:13:02.650586+00:00 app[web.1]: Traceback (most recent call last):
2020-01-29T22:13:02.650588+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
2020-01-29T22:13:02.650595+00:00 app[web.1]: worker.init_process()
2020-01-29T22:13:02.650597+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 119, in init_process
2020-01-29T22:13:02.650599+00:00 app[web.1]: self.load_wsgi()
2020-01-29T22:13:02.650602+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
2020-01-29T22:13:02.650604+00:00 app[web.1]: self.wsgi = self.app.wsgi()
2020-01-29T22:13:02.650606+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
2020-01-29T22:13:02.650608+00:00 app[web.1]: self.callable = self.load()
2020-01-29T22:13:02.650610+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
2020-01-29T22:13:02.650612+00:00 app[web.1]: return self.load_wsgiapp()
2020-01-29T22:13:02.650614+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
2020-01-29T22:13:02.650616+00:00 app[web.1]: return util.import_app(self.app_uri)
2020-01-29T22:13:02.650618+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/util.py", line 358, in import_app
2020-01-29T22:13:02.650620+00:00 app[web.1]: mod = importlib.import_module(module)
2020-01-29T22:13:02.650622+00:00 app[web.1]: File "/app/.heroku/python/lib/python3.6/importlib/__init__.py", line 126, in import_module
2020-01-29T22:13:02.650624+00:00 app[web.1]: return _bootstrap._gcd_import(name[level:], package, level)
2020-01-29T22:13:02.650627+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 994, in _gcd_import
2020-01-29T22:13:02.650629+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 971, in _find_and_load
2020-01-29T22:13:02.650631+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 941, in _find_and_load_unlocked
2020-01-29T22:13:02.650632+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
2020-01-29T22:13:02.650634+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 994, in _gcd_import
2020-01-29T22:13:02.650636+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 971, in _find_and_load
2020-01-29T22:13:02.650638+00:00 app[web.1]: File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
2020-01-29T22:13:02.650693+00:00 app[web.1]: ModuleNotFoundError: No module named 'Neuroethics_Behavioral_Task'
2020-01-29T22:13:02.651049+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [11] [INFO] Worker exiting (pid: 11)
2020-01-29T22:13:02.831990+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [4] [INFO] Shutting down: Master
2020-01-29T22:13:02.832483+00:00 app[web.1]: [2020-01-29 22:13:02 +0000] [4] [INFO] Reason: Worker failed to boot.
2020-01-29T22:13:02.988239+00:00 heroku[web.1]: Process exited with status 3

Ошибка интереса здесь: No Module named Neuroethics_Behavioral_Task

На данный момент я пытаюсь угадать, как этот файл должен предположить посмотрите ... может кто-нибудь объяснить синтаксис (если в этом проблема?)

Редактировать 2: я немного изменил __init__.py и experiment.py, основываясь на одном комментарии. Прямо сейчас __init__.py показывает следующее

import os

from flask import Flask
from flask import (
    Blueprint, flash, g, redirect, render_template, request, session, url_for
)

# app = Flask(__name__, instance_relative_config=True)

def create_app(test_config=None):
    # create and configure the 
    from .experiment import app
    #app = Flask(__name__, instance_relative_config=True) # creates the flask instance
    app.config.from_mapping(
        SECRET_KEY='dev',
        DATABASE=os.path.join(app.instance_path, 'Neuroethics_Behavioral_Task.sqlite'),
    )

    if test_config is None:
        # load the instance config, if it exists, when not testing
        app.config.from_pyfile('config.py', silent=True)
    else:
        # load the test config if passed in
        app.config.from_mapping(test_config)

    # ensure the instance folder exists
    try:
        os.makedirs(app.instance_path)
    except OSError:
        pass
    # from . import experiment
    # from the current directory, import the variables in the experiment.py 
    app.register_blueprint(experiment.bp)
    app.add_url_rule('/', endpoint='index')



    return app

# if __name__ == '__main__':
#     app.run(debug=True)

Что касается experiment.py

import functools

from flask import (
    Blueprint, flash, g, redirect, render_template, request, session, url_for, Flask
)
from werkzeug.security import check_password_hash, generate_password_hash


app = Flask(__name__, instance_relative_config=True) # creates the flask instance

bp= Blueprint('experiment', __name__)

# ... all of my view functions
# ...
# Skipping all the way to main

if __name__ == "__main__":
    app.run()

Я становлюсь все более и более подозрительным, что, возможно, структура дерева каталогов для моего проекта не ' не правильно.

1 Ответ

0 голосов
/ 30 января 2020

Если _init_.py включает импорт вашего приложения, как это, from .experiment import app, тогда попробуйте web: gunicorn Neuroethics_Behavioral_Task:app

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...