Source code for zemfrog.app
import os
from importlib import import_module
from celery import Celery
from flask import Flask
from flask.cli import load_dotenv
from .exception import ZemfrogEnvironment
from .helper import get_import_name
[docs]def make_celery(app: Flask) -> Celery:
"""
Creating a celery application for flask applications.
Source: https://flask.palletsprojects.com/en/1.1.x/patterns/celery/#configure
"""
celery = Celery(
app.import_name,
backend=app.config["CELERY_RESULT_BACKEND"],
broker=app.config["CELERY_BROKER_URL"],
)
celery.conf.update(app.config)
class ContextTask(celery.Task):
def __call__(self, *args, **kwargs):
with app.app_context():
return self.run(*args, **kwargs)
celery.Task = ContextTask
return celery
[docs]def load_config(app: Flask):
"""
Loads the configuration for your zemfrog application based on the environment
``ZEMFROG_ENV``, change your application environment in the file ``.flaskenv``.
"""
path = os.path.join(app.root_path, ".flaskenv")
load_dotenv(path)
env = os.getenv("ZEMFROG_ENV")
if not env:
raise ZemfrogEnvironment("environment not found")
import_name = get_import_name(app)
app.config.from_object(import_name + "config." + env.capitalize())
[docs]def create_app(name: str) -> Flask:
"""
Functions to build your flask application and load all configurations.
:param name: import name.
"""
app = Flask(name)
import_name = get_import_name(app)
dirname = "loaders"
prefix = dirname + "."
with app.app_context():
load_config(app)
for name in app.config.get(dirname.upper(), []):
yourloader = name
if not name.startswith(prefix):
yourloader = prefix + yourloader
try:
yourloader = import_module(import_name + yourloader)
loader = getattr(yourloader, "loader")
except (ImportError, AttributeError):
yourloader = import_module(name)
loader = getattr(yourloader, "loader")
loader(app)
return app