Я пытаюсь создать простое приложение с помощью flask, и я решил также использовать gunicorn и docker.
На данный момент у меня такая конфигурация:
> app
> myapp
__init__.py
index.html
docker-compose.yml
Dockerfile
Мой docker-compose.yml:
version: '2'
services:
web:
build: .
volumes:
- .:/app
command: /usr/local/bin/gunicorn -b :8000 myapp:app
working_dir: /app
Мой __init__.py:
import os
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
if __name__ == '__main__':
app.run()
Эта минимальная конфигурация работает, и я могу получить доступ к своему приложению и получить свою индексную страницу.
Что мне не нравится, так это создание моего приложения внутри __init__.py, поэтому я хотел бы переместить создание приложения в файл app.py.
Новая структура будет:
> app
> myapp
__init__.py
app.py
index.html
docker-compose.yml
Dockerfile
app.py будет иметь содержимое старого файла __init__.py, а новый файл __init__.py будет пустым.
Это не работает. Я получаю ошибку
Failed to find application: 'myapp'
и я не понимаю почему.
Есть идеи по этому поводу?
Попробую поменять, спасибо.






В первой конфигурации ваше приложение Flask находилось непосредственно в пакете myapp; после того, как вы его переместили, он находится в модуле myapp.app.
Gunicorn надеется приложение должно быть указано как module_name:variable_name, что-то вроде from module_name import variable_name.
Вариант первый: укажите правильный путь к модулю:
/usr/local/bin/gunicorn -b :8000 myapp.app:app
Вариант второй: снова добавить приложение в myapp. В myapp/__init__.py добавьте
from .app import app
Обратите внимание, что если переменная и модуль имеют одинаковое имя, модуль будет затенен (не очень хорошо, но и не критично).
Я читал документацию, но не совсем понимал, как нужно переводить вещи в моем конкретном случае. Большое спасибо за ваше объяснение!
test- плохой выбор для имени пакета, которое может вызвать или не вызвать вашу проблему.