set up flask app
This commit is contained in:
parent
32c56a7325
commit
754676ea0a
|
@ -14,6 +14,8 @@ python-dotenv = "*"
|
||||||
rich = "*"
|
rich = "*"
|
||||||
typer = "*"
|
typer = "*"
|
||||||
flask = "*"
|
flask = "*"
|
||||||
|
flask-sqlalchemy = "^3.1.1"
|
||||||
|
flask-migrate = "^4.1.0"
|
||||||
|
|
||||||
[tool.poetry.group.dev.dependencies]
|
[tool.poetry.group.dev.dependencies]
|
||||||
pytest = "*"
|
pytest = "*"
|
||||||
|
@ -25,7 +27,8 @@ build-backend = "poetry.core.masonry.api"
|
||||||
|
|
||||||
|
|
||||||
[tool.poetry.scripts]
|
[tool.poetry.scripts]
|
||||||
ttfrog = "ttfrog.cli:app"
|
ttfrog = "ttfrog.cli:main"
|
||||||
|
web = "ttfrog.web:main"
|
||||||
|
|
||||||
|
|
||||||
### SLAM
|
### SLAM
|
||||||
|
|
50
src/ttfrog/app.py
Normal file
50
src/ttfrog/app.py
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
import importlib
|
||||||
|
import os
|
||||||
|
|
||||||
|
from flask import Flask
|
||||||
|
from flask_migrate import Migrate
|
||||||
|
from flask_sqlalchemy import SQLAlchemy
|
||||||
|
|
||||||
|
_context = None
|
||||||
|
|
||||||
|
|
||||||
|
class ApplicationContext:
|
||||||
|
"""
|
||||||
|
Interface for the flask application
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, schema_module_name: str):
|
||||||
|
self.schema_module = importlib.import_module(schema_module_name)
|
||||||
|
self.db = SQLAlchemy()
|
||||||
|
self.migrate = Migrate()
|
||||||
|
self._app = Flask("flask")
|
||||||
|
|
||||||
|
self._initialized = False
|
||||||
|
self._enable_migrations = False
|
||||||
|
|
||||||
|
self._app.config["SECRET_KEY"] = os.getenv("SECRET_KEY", "secret string")
|
||||||
|
self._app.config["SQLALCHEMY_DATABASE_URI"] = os.getenv(
|
||||||
|
"DATABASE_URL", "sqlite:////" + os.path.join(self._app.root_path, "data.db")
|
||||||
|
)
|
||||||
|
self._app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
|
||||||
|
|
||||||
|
@property
|
||||||
|
def flask(self):
|
||||||
|
if not self._initialized:
|
||||||
|
raise RuntimeError("You must initialize first.")
|
||||||
|
return self._app
|
||||||
|
|
||||||
|
def initialize(self):
|
||||||
|
self.db.init_app(self._app)
|
||||||
|
if self._enable_migrations:
|
||||||
|
self.migrate.init_app(self._app, self.db)
|
||||||
|
self._initialized = True
|
||||||
|
return self.flask
|
||||||
|
|
||||||
|
|
||||||
|
def initialize(schema_module_name: str = "ttfrog.schema"):
|
||||||
|
global _context
|
||||||
|
if not _context:
|
||||||
|
_context = ApplicationContext(schema_module_name)
|
||||||
|
_context.initialize()
|
||||||
|
return _context
|
|
@ -3,17 +3,25 @@ import logging
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
import click
|
||||||
import typer
|
import typer
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
|
from flask.cli import FlaskGroup
|
||||||
from rich.logging import RichHandler
|
from rich.logging import RichHandler
|
||||||
|
|
||||||
|
import ttfrog.app
|
||||||
|
|
||||||
CONFIG_DEFAULTS = """
|
CONFIG_DEFAULTS = """
|
||||||
# ttfrog Defaults
|
# ttfrog Defaults
|
||||||
|
|
||||||
LOG_LEVEL=INFO
|
LOG_LEVEL=INFO
|
||||||
"""
|
"""
|
||||||
|
|
||||||
app = typer.Typer()
|
main_app = typer.Typer()
|
||||||
|
|
||||||
|
_context = ttfrog.app.initialize()
|
||||||
|
flask_app = _context.flask
|
||||||
|
|
||||||
app_state = dict(
|
app_state = dict(
|
||||||
config_file=Path("~/.config/ttfrog.conf").expanduser(),
|
config_file=Path("~/.config/ttfrog.conf").expanduser(),
|
||||||
)
|
)
|
||||||
|
@ -21,8 +29,8 @@ app_state = dict(
|
||||||
logger = logging.getLogger("ttfrog.cli")
|
logger = logging.getLogger("ttfrog.cli")
|
||||||
|
|
||||||
|
|
||||||
@app.callback(invoke_without_command=True)
|
@main_app.callback(invoke_without_command=True)
|
||||||
def main(
|
def callback(
|
||||||
context: typer.Context,
|
context: typer.Context,
|
||||||
verbose: bool = typer.Option(False, help="Enable verbose output."),
|
verbose: bool = typer.Option(False, help="Enable verbose output."),
|
||||||
log_level: str = typer.Option("error", help=" Set the log level."),
|
log_level: str = typer.Option("error", help=" Set the log level."),
|
||||||
|
@ -54,4 +62,33 @@ def run(context: typer.Context):
|
||||||
"""
|
"""
|
||||||
The default CLI entrypoint is ttfrog.cli.run().
|
The default CLI entrypoint is ttfrog.cli.run().
|
||||||
"""
|
"""
|
||||||
raise NotImplementedError("Please define ttfrog.cli.run().")
|
flask_app.run()
|
||||||
|
|
||||||
|
|
||||||
|
@flask_app.shell_context_processor
|
||||||
|
def make_shell_context():
|
||||||
|
return {"db": flask_app.db, "app": flask_app._app}
|
||||||
|
|
||||||
|
|
||||||
|
@flask_app.cli.command()
|
||||||
|
@click.option("--drop", is_flag=True, help="Create after drop.")
|
||||||
|
@click.pass_context
|
||||||
|
def setup(ctx, drop: bool):
|
||||||
|
"""
|
||||||
|
(Re)create the database.
|
||||||
|
"""
|
||||||
|
if drop:
|
||||||
|
ctx.db.drop_all()
|
||||||
|
ctx.db.create_all()
|
||||||
|
|
||||||
|
|
||||||
|
@click.group(cls=FlaskGroup, create_app=lambda: flask_app)
|
||||||
|
@click.pass_context
|
||||||
|
def app(ctx):
|
||||||
|
"""
|
||||||
|
Application management functions
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
main = typer.main.get_command(main_app)
|
||||||
|
main.add_command(app, "app")
|
||||||
|
|
0
src/ttfrog/db.py
Normal file
0
src/ttfrog/db.py
Normal file
1
src/ttfrog/schema.ph
Normal file
1
src/ttfrog/schema.ph
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# schema goes here
|
0
src/ttfrog/schema.py
Normal file
0
src/ttfrog/schema.py
Normal file
9
src/ttfrog/web.py
Normal file
9
src/ttfrog/web.py
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
from ttfrog.app import initialize
|
||||||
|
|
||||||
|
_context = initialize()
|
||||||
|
app = _context.flask
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/", defaults={"path": ""})
|
||||||
|
def serve(path):
|
||||||
|
return "HELLO"
|
Loading…
Reference in New Issue
Block a user