Docker + Gunicorn + Flask, я не понимаю, почему моя установка не работает

Я пытаюсь создать простое приложение с помощью 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'

и я не понимаю почему.

Есть идеи по этому поводу?

test - плохой выбор для имени пакета, которое может вызвать или не вызвать вашу проблему.
Norrius 11.03.2018 11:38

Попробую поменять, спасибо.

heapOverflow 11.03.2018 11:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
1 232
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В первой конфигурации ваше приложение 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

Обратите внимание, что если переменная и модуль имеют одинаковое имя, модуль будет затенен (не очень хорошо, но и не критично).

Я читал документацию, но не совсем понимал, как нужно переводить вещи в моем конкретном случае. Большое спасибо за ваше объяснение!

heapOverflow 11.03.2018 12:01

Другие вопросы по теме