Siguiendo este tutorial para dockerizar una pila Flask, estoy tratando de iniciar una aplicación existente desde un archivo manage.py externo
La estructura de mi aplicación es así:
└── services └── web ├── manage.py └── myapp └── requirements.txt └── myserver └──__init__.py └──config └──config.pyEl archivo manage.py:
import os os.chdir('myapp') from flask.cli import FlaskGroup from myapp.myserver import create_app app = create_app() cli = FlaskGroup(app) if __name__ == "__main__": cli() y finalmente, el myapp/myserver/__init__.py (simplificado):
from myserver.config.config import Config # this file exists and imports work when i launch from pycharm def create_app(): app = Flask(__name__) ...other stuff here return app Entonces, cuando intento ejecutar: python3 manage.py run , el resultado es:
File "manage.py", line 4, in <module> from myapp.myserver import create_app File "/var/www/html/flask-docker/services/web/myapp/myserver/__init__.py", line 12, in <module> from myserver.config.config import Config La importación de configuración de __init__.py no se puede resolver. Traté de resolver esto con el chdir visible en manage.py.
Mis variables env son las que obtuve de una configuración de matraz Pycharm en funcionamiento:
FLASK_APP="myserver:create_app()"Logré pasar con éxito la instrucción de importación reemplazando:
from myserver.config.config import Configpor
from .config.config import Configpero todo el proyecto contiene importaciones comenzando por myserver
Entonces, la pregunta final es: ¿por qué el archivo de inicio dentro de myserver no reconoce la carpeta/módulo de myserver? Esta configuración funciona bien cuando la lanzo a través de PyCharm
No puede encontrar el módulo porque no sabe en qué directorio buscar para encontrar el archivo manage.py.
intente agregar la información de manage.py al archivo de inicio. desde la gestión de importación web
El comentario de Brandon y esta respuesta me llevaron a una solución.
gestionar.py
import sys #this is the fix sys.path.append(os.path.join(os.path.dirname(__file__),'myapp')) from flask.cli import FlaskGroup from myapp.myserver import create_app app = create_app() cli = FlaskGroup(app) ## Heading ## if __name__ == "__main__": cli() En lugar de cambiar el directorio de trabajo con os.chdir , lo cambio usando sys.path . Ahora puedo usar el archivo de inicio de mis servidores