如何设置FlaskSQLAlchemy以在启动时优雅地管理PostgreSQL不可用性

2024-05-26 11:54:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个flask API,一切正常,一切都已固定,以便进行本地测试,这是flaskinit.py:

import os
from os.path import join, dirname

import cloudinary
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration
from dotenv import load_dotenv
from flask import Flask
from flask_cors import CORS
from flask_marshmallow import Marshmallow
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

cors = CORS()
marsh = Marshmallow()
db = SQLAlchemy()
migrate = Migrate()
limiter = Limiter(key_func=get_remote_address)

from deblurrer.api import api_bp


def create_app(config='flask_config.Production'):
    """
    Init core application.

    Args:
        config: can be import to object or the object itself

    Returns:
        Application instance
    """
    # Load .env vars
    dotenv_path = join(dirname(dirname(__file__)), '.env')
    load_dotenv(dotenv_path)

    # Setup default production config
    app = Flask('deblurrer', instance_relative_config=True)
    app.config.from_object(config)

    # Sentry config
    sentry_sdk.init(
        dsn=os.environ.get('SENTRY_DNS'),
        integrations=[FlaskIntegration()]
    )

    # Init Cloudinary credentials
    cloudinary.config(
        cloud_name = os.environ.get('CLOUDINARY_CLOUD_NAME'),
        api_key = os.environ.get('CLOUDINARY_API_KEY'),
        api_secret = os.environ.get('CLOUDINARY_API_SECRET'),
    )

    # Init Plugins
    cors.init_app(app)
    marsh.init_app(app)
    db.init_app(app)
    migrate.init_app(app, db)
    limiter.init_app(app)

    with app.app_context():
        app.register_blueprint(api_bp, url_prefix='/api')

        # Create tables for models
        db.create_all()

        return app

当我执行docker-compose up时,PostgreSQL容器不会在flaskapi容器之前启动,这是正常的和预期的。建议准备API,以便在任何时候(包括开始时间)优雅地管理数据库不可用性

我的问题是,我如何在我的烧瓶应用程序上做到这一点?在初始化SQLAlchemy时,似乎必须在init.py上执行此操作,但我不知道如何进行,我尝试了一些研究,但没有明显的结果,您能帮助我吗

谢谢


Tags: pathfromimportapiconfigappflaskdb
1条回答
网友
1楼 · 发布于 2024-05-26 11:54:57

继续努力

# Connect to database
tries = 5
while tries > 0:
    try:
        db.create_all()
        tries = 0
    except:
        tries += -1
        print('Failed to connect to database. Waiting and then trying again (try countdown: %s)' % tries)
        sleep(10)  # Wait a bit until database is loaded

相关问题 更多 >