Compare commits
15 Commits
0006044ae4
...
main
Author | SHA1 | Date | |
---|---|---|---|
d3d3c98f99 | |||
9e010ed389 | |||
636a382cf5 | |||
76a351710f | |||
c1f0da4a9c | |||
eefc952ff0 | |||
8c35b3bd8c | |||
60011b1c72 | |||
859a962c12 | |||
0e9df4f859 | |||
1554404657 | |||
925af7d314 | |||
fb260a0f6d | |||
dcd9a39b46 | |||
8194e3e9fe |
@ -4,7 +4,7 @@ from flask_jwt_extended import JWTManager
|
|||||||
from jwt import ExpiredSignatureError
|
from jwt import ExpiredSignatureError
|
||||||
from models import db, RevokedToken
|
from models import db, RevokedToken
|
||||||
import os
|
import os
|
||||||
from utils import init_db
|
from utils import init_db, wait_for_db
|
||||||
from views import user_bp
|
from views import user_bp
|
||||||
from werkzeug.exceptions import HTTPException
|
from werkzeug.exceptions import HTTPException
|
||||||
|
|
||||||
@ -53,6 +53,7 @@ def create_app(config_name="default"):
|
|||||||
|
|
||||||
# Fill database by initial values (only if we are not testing)
|
# Fill database by initial values (only if we are not testing)
|
||||||
with app.app_context():
|
with app.app_context():
|
||||||
|
wait_for_db()
|
||||||
db.create_all()
|
db.create_all()
|
||||||
if config_name != "testing":
|
if config_name != "testing":
|
||||||
init_db()
|
init_db()
|
||||||
@ -61,5 +62,7 @@ def create_app(config_name="default"):
|
|||||||
|
|
||||||
# Server start only if we run app directly
|
# Server start only if we run app directly
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
from waitress import serve
|
||||||
app = create_app()
|
app = create_app()
|
||||||
app.run(host="0.0.0.0")
|
port = os.getenv("APP_PORT", "80")
|
||||||
|
serve(app, host="0.0.0.0", port=port)
|
||||||
|
@ -11,4 +11,5 @@ mysql-connector-python==9.2.0
|
|||||||
python-dotenv==1.0.0
|
python-dotenv==1.0.0
|
||||||
SQLAlchemy==2.0.23
|
SQLAlchemy==2.0.23
|
||||||
typing_extensions==4.8.0
|
typing_extensions==4.8.0
|
||||||
|
waitress==3.0.2
|
||||||
Werkzeug==3.0.1
|
Werkzeug==3.0.1
|
||||||
|
19
api/utils.py
19
api/utils.py
@ -2,6 +2,9 @@ from flask import abort
|
|||||||
from flask_jwt_extended import get_jwt_identity
|
from flask_jwt_extended import get_jwt_identity
|
||||||
from models import User, db
|
from models import User, db
|
||||||
import os
|
import os
|
||||||
|
from sqlalchemy import text
|
||||||
|
from sqlalchemy.exc import DatabaseError
|
||||||
|
import time
|
||||||
from werkzeug.security import generate_password_hash
|
from werkzeug.security import generate_password_hash
|
||||||
|
|
||||||
|
|
||||||
@ -27,6 +30,22 @@ def get_user_or_404(user_id):
|
|||||||
return user
|
return user
|
||||||
|
|
||||||
|
|
||||||
|
MAX_RETRIES = 100
|
||||||
|
|
||||||
|
def wait_for_db():
|
||||||
|
for retries in range(MAX_RETRIES):
|
||||||
|
try:
|
||||||
|
with db.engine.connect() as connection:
|
||||||
|
connection.execute(text("SELECT 1"))
|
||||||
|
print("Successfully connected with database.")
|
||||||
|
return
|
||||||
|
except DatabaseError:
|
||||||
|
print(f"Waiting for database... (retry {retries + 1})")
|
||||||
|
time.sleep(3)
|
||||||
|
print("Failed to connect to database.")
|
||||||
|
raise Exception("Database not ready after multiple retries.")
|
||||||
|
|
||||||
|
|
||||||
def init_db():
|
def init_db():
|
||||||
"""Create default admin account if database is empty"""
|
"""Create default admin account if database is empty"""
|
||||||
with db.session.begin():
|
with db.session.begin():
|
||||||
|
Reference in New Issue
Block a user