-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathrun.py
More file actions
88 lines (75 loc) · 4.02 KB
/
Copy pathrun.py
File metadata and controls
88 lines (75 loc) · 4.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from gevent import monkey
monkey.patch_all()
import logging
import subprocess
import sys
import os
import platform
# --- CONFIGURAÇÃO DE LIMPEZA DE LOGS ---
# Define o nível para WARNING para evitar que requisições HTTP (INFO) poluam o console
logging.getLogger('geventwebsocket.handler').setLevel(logging.WARNING)
logging.getLogger('werkzeug').setLevel(logging.WARNING)
# ---------------------------------------
# NOVO: Cria o diretório de cache de imagens antes de tudo, se necessário
from app.config import CONFIG_DIR, load_or_create_config
from app import create_app, extensions
IMAGE_CACHE_DIR = os.path.join(CONFIG_DIR, 'cache', 'images')
os.makedirs(IMAGE_CACHE_DIR, exist_ok=True)
# Carrega a configuração antes de criar a aplicação
config = load_or_create_config()
app = create_app()
def run_db_upgrade():
"""Executa o comando 'flask db upgrade' para garantir que a base de dados está atualizada."""
logging.info("A verificar e aplicar migrações da base de dados...")
try:
# Usamos 'sys.executable -m flask' para garantir que estamos a usar o mesmo ambiente python
# e evitar problemas de PATH.
# Cria uma cópia do ambiente atual e define a codificação de I/O do Python para UTF-8
# para o subprocesso. Isto resolve erros de 'UnicodeDecodeError' no Windows.
env = os.environ.copy()
env['PYTHONIOENCODING'] = 'utf-8'
result = subprocess.run(
[sys.executable, "-m", "flask", "db", "upgrade"],
capture_output=True,
text=True,
check=True,
encoding='utf-8', # Espera que a saída seja UTF-8
env=env # Passa o ambiente modificado para o subprocesso
)
logging.info("Migrações da base de dados aplicadas com sucesso.")
# Se houver alguma saída do comando (ex: "Already up to date."), ela será logada.
if result.stdout:
logging.info(f"Saída do Flask DB Upgrade:\n{result.stdout}")
return True
except FileNotFoundError:
logging.error("Erro: O comando 'flask' não foi encontrado. Certifique-se de que o Flask está instalado e no seu PATH.")
return False
except subprocess.CalledProcessError as e:
# Este bloco é executado se o comando 'flask db upgrade' retornar um erro.
logging.error("Ocorreu um erro ao executar 'flask db upgrade'.")
logging.error(f"Código de Saída: {e.returncode}")
logging.error(f"Saída (stdout):\n{e.stdout}")
logging.error(f"Erro (stderr):\n{e.stderr}")
return False
except Exception as e:
logging.error(f"Um erro inesperado ocorreu durante a migração da base de dados: {e}")
return False
if __name__ == '__main__':
# Executa a migração da base de dados antes de iniciar o servidor.
# A aplicação só irá iniciar se a migração for bem-sucedida.
if run_db_upgrade():
# Obtém o host e a porta do ficheiro de configuração
host = config.get('APP_HOST', '0.0.0.0')
port = int(config.get('APP_PORT', 5000))
logging.info(f"A iniciar o servidor em http://{host}:{port}")
# Usa o servidor de desenvolvimento padrão no Windows para evitar o conflito com gevent
if platform.system() == "Windows":
logging.warning("A executar em modo de desenvolvimento no Windows. O monkey-patch do gevent foi ignorado.")
extensions.socketio.run(app, host=host, port=port)
else:
# Para outros sistemas (Linux, etc.), continua a usar a configuração de produção com Gunicorn
logging.info("A executar em modo de produção com Gunicorn e Gevent.")
# log_output=False instrui o servidor WSGI a não logar cada requisição no stdout
extensions.socketio.run(app, host=host, port=port, log_output=False)
else:
logging.critical("A aplicação não será iniciada devido a uma falha na migração da base de dados.")