blob: 8037060c4b6e068934472ed35dd030e517cbef0d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
import tomllib
import re
from flask_cors import CORS
import sqlalchemy.exc as sqlalchemy_exceptions
from sqlalchemy import select
from src.database import db, init_db
from src.database.models import Blog
with open('config.toml', 'rb') as config_file:
user_config = tomllib.load(config_file)
def initialize(app):
app.config['SQLALCHEMY_DATABASE_URI'] = database_connection_string(app)
init_db(app)
# Check the config file for any blog domains.
initialize_blogs(app)
initialize_cors_policies(app)
initialize_blueprints(app)
def database_connection_string(app):
if app.debug:
return (f"mysql+pymysql://{user_config['Database']['user']}:"
f"{user_config['Database']['password']}@"
f"{user_config['Database']['host']}/dev_simple_comments")
else:
return (f"mysql+pymysql://{user_config['Database']['user']}:"
f"{user_config['Database']['password']}@"
f"{user_config['Database']['host']}/simple_comments")
def initialize_blogs(app):
with app.app_context():
for domain in user_config['Blogs']['domains']:
blog = Blog(domain=domain)
db.session.add(blog)
# It may be worth it to research a better way to do this...
try:
db.session.commit()
# The blog's already been registered.
except sqlalchemy_exceptions.IntegrityError:
db.session.rollback()
continue
# The tables haven't been created.
except sqlalchemy_exceptions.ProgrammingError:
break
def configured_blogs(app):
statement = select(Blog.domain).where(Blog.domain.in_(user_config['Blogs']['domains']))
with app.app_context():
return [r for r, in db.session.execute(statement)]
def initialize_cors_policies(app):
allowed_origins = configured_blogs(app)
cors_settings = {'resources': {r"/api/*": {'origins': allowed_origins},
r"/static/*": {'origins': allowed_origins}}
}
CORS(app, **cors_settings)
def initialize_blueprints(app):
import src.controllers as app_controllers
controller_regex = re.compile('_controller$')
controllers = [definition for definition in dir(app_controllers)
if controller_regex.search(definition) is not None]
for controller in controllers:
# Remove the _controller substring from the controller name,
# getting its prefix.
controller_name = controller.split('_')[0]
blueprint = getattr(getattr(app_controllers, controller),
f"{controller_name}_blueprint")
app.register_blueprint(blueprint)
|