Flask развертывание в Heroku: 404 URL не найден, обсуждается структура файла Flask, совместимая с Heroku - PullRequest
0 голосов
/ 30 января 2020

Я преодолел упомянутую здесь ошибку, я думаю ... Но есть сообщение об ошибке 404, которое не исчезнет go для моего flask приложения, как только я запустил его на heroku, и я не уверен что делать на этом этапе. Heroku / Flask развертывание не выполнено, либо «не удается найти приложение атрибута», либо «не удается найти имя модуля (flask_module)», pro c файл виноват?

Я реструктурировал свой flask проект так, чтобы он использовал организационный шаблон «одного модуля».

Дерево файлов:

enter image description here

My __init__.py и experiment.py / app.py files

На мой предыдущий вопрос мне сказали, что то, как я их написал, "странно", так что ...

Мой experiment.py файл. Я включил flask() вызов в верхней части файла, основываясь на других сообщениях и коде, который я видел.

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__)

###
# Some view functions...
###

if __name__ == "__main__":

    app.run()

__init__.py в значительной степени заимствован прямо из краткого руководства по Flask, но я удалил вызов Flask() и импортировал присвоенную ему переменную app из файла experiment.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):

    from .experiment import app
    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

    app.register_blueprint(experiment.bp)
    app.add_url_rule('/', endpoint='index')


    return app

Procfile

Последний и Важной частью этого является мой Procfile, который я до сих пор не знаю, как он написан на данный момент.

heroku ps:scale web=1

web: gunicorn experiment:app

Примечание: это приложение все еще не в сети, хотя я просто сделал важное замечание.

Я попытался перейти от организационного шаблона "пакет" к организационному "один модуль" шаблон, так как подавляющее большинство учебных пособий используют шаблон одного модуля. Это означает перемещение всего содержимого app_dir в каталог root.

Затем мой профайл включил следующее: web: gunicorn experiment:app.

Это изменило ошибку. Вместо этого загрузилась нестилизованная страница html, в которой говорилось, что «URL не найден». проверка логов героки показала следующее

2020-01-30T21:47:14.127902+00:00 heroku[web.1]: State changed from starting to up
2020-01-30T21:47:13.808735+00:00 app[web.1]: [2020-01-30 21:47:13 +0000] [4] [INFO] Starting gunicorn 20.0.4
2020-01-30T21:47:13.828081+00:00 app[web.1]: [2020-01-30 21:47:13 +0000] [4] [INFO] Listening at: http://0.0.0.0:24870 (4)
2020-01-30T21:47:13.830362+00:00 app[web.1]: [2020-01-30 21:47:13 +0000] [4] [INFO] Using worker: sync
2020-01-30T21:47:13.850689+00:00 app[web.1]: [2020-01-30 21:47:13 +0000] [10] [INFO] Booting worker with pid: 10
2020-01-30T21:47:13.878989+00:00 app[web.1]: [2020-01-30 21:47:13 +0000] [11] [INFO] Booting worker with pid: 11
2020-01-30T21:47:14.000000+00:00 app[api]: Build succeeded
2020-01-30T21:47:23.319429+00:00 heroku[router]: at=info method=GET path="/" host=neuroethics-behavioral-task.herokuapp.com request_id=46d28f97-a46a-479d-b56f-0ad910e85f03 fwd="144.118.77.114" dyno=web.1 connect=0ms service=32ms status=404 bytes=385 protocol=https
2020-01-30T21:47:23.318447+00:00 app[web.1]: 10.155.88.71 - - [30/Jan/2020:21:47:23 +0000] "GET / HTTP/1.1" 404 232 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"

Последняя часть самая важная,

2020-01-30T21:47:23.319429+00:00 heroku[router]: at=info method=GET path="/" host=neuroethics-behavioral-task.herokuapp.com request_id=46d28f97-a46a-479d-b56f-0ad910e85f03 fwd="144.118.77.114" dyno=web.1 connect=0ms service=32ms status=404 bytes=385 protocol=https
2020-01-30T21:47:23.318447+00:00 app[web.1]: 10.155.88.71 - - [30/Jan/2020:21:47:23 +0000] "GET / HTTP/1.1" 404 232 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"

Так что эта ошибка имеет статус 404. Также он не обрабатывает sh так же, как обычно происходит сбой heroku из-за ошибки Module Not Found, как прежде.

Взгляните на этот пост ... 404 Ошибка при запуске Flask приложение на Heroku

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

Я заметил, что ключевым моментом для меня является то, что ... если я закомментирую строки в моем файле __init__.py для регистрации чертежа и добавления правила URL, то мое приложение flask локально выдает ту же нестилизованную страницу ошибки 404, которую я всегда вижу на heroku.

Так что я застрял с этой ошибкой 404, но теперь у меня наконец-то возникает подозрение, что проблема связана с тем, что URL-адреса неправильно смонтированы для по какой-то причине, когда я развернул приложение на heroku.

Ключевой вопрос, который у меня возник на данный момент ... мой файл experiment.py / app.py должен вызывать create_app(), и это как-то не казнить при развертывании на героку? Мой файл experiment.py также должен содержать правила / чертежи URL? Если я попытаюсь скопировать две строки из __init__.py, которые делают это, мое приложение не запустится локально.

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