python - 如何设置 Flask-SQLAlchemy 在启动时优雅地管理 PostgreSQL 不可用
问题描述
我有一个烧瓶 API,一切正常,一切都被 Dockerized 用于本地测试,这是烧瓶init .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 容器不会在 Flask API 容器之前启动,这是正常和预期的。建议准备 API 以在任何时间(包括开始时间)优雅地管理数据库不可用性。
我的问题是,如何在我的烧瓶应用程序上做到这一点?似乎这必须在初始化 Flask-SQLAlchemy 时在init .py 上完成,但我不知道怎么做,我试图做一些研究,但没有任何明显的出现,你能帮帮我吗?
谢谢!
解决方案
只要继续努力...
# 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
推荐阅读
- c - 将 char 数组传递给方法时,该数组会丢失其值
- java - 考虑到 500 个请求/秒,我如何优化 for 循环
- node.js - 使用增量函数进行验证
- python - 通过用户输入在 CSV 文件中使用查询
- javascript - 要求 remoteParticipant 在房间视频通话中共享他们的屏幕之前获得批准 twilio
- anylogic - Anylogic,如何创建取决于每天到达代理数量的动态批量大小?
- java - gradlew bootRun 与 java -jar
- python - 我可以在英国开放天气地图中按邮政编码搜索吗
- jquery - 自定义事件在 Jquery 中触发,但找不到任何事件处理程序
- java - 不使用 JLayeredPane 将 jcomponent 移到后面