App Factory pattern
This commit is contained in:
parent
d6836915bb
commit
26227a66c5
@ -0,0 +1,60 @@
|
|||||||
|
from .config import Development as Config
|
||||||
|
from .install import install_app
|
||||||
|
from .models import Entry, Dataset, Test, User
|
||||||
|
from .extensions import bootstrap, csrf, db, login_manager, mail
|
||||||
|
from .tools.data import save
|
||||||
|
from .tools.logs import write
|
||||||
|
|
||||||
|
from flask import flash, Flask, render_template, request
|
||||||
|
from flask.helpers import url_for
|
||||||
|
from flask.json import jsonify
|
||||||
|
from flask_wtf.csrf import CSRFError
|
||||||
|
from werkzeug.middleware.proxy_fix import ProxyFix
|
||||||
|
|
||||||
|
from cryptography.fernet import Fernet
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
def create_app():
|
||||||
|
app = Flask(__name__)
|
||||||
|
app.config.from_object(Config())
|
||||||
|
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto= 1, x_host= 1)
|
||||||
|
|
||||||
|
bootstrap.init_app(app)
|
||||||
|
csrf.init_app(app)
|
||||||
|
db.init_app(app)
|
||||||
|
login_manager.init_app(app)
|
||||||
|
mail.init_app(app)
|
||||||
|
|
||||||
|
login_manager.login_view = 'admin._login'
|
||||||
|
@login_manager.user_loader
|
||||||
|
def _load_user(id):
|
||||||
|
return User.query.filter_by(id=id).first()
|
||||||
|
|
||||||
|
@app.before_request
|
||||||
|
def _check_cookie_consent():
|
||||||
|
if request.cookies.get('cookie_consent'):
|
||||||
|
return
|
||||||
|
if any([ request.path.startswith(x) for x in [ '/admin/static/', '/root/', '/quiz/static', '/cookies/' ] ]):
|
||||||
|
return
|
||||||
|
flash(f'<strong>Cookie Consent</strong>: This web site only stores minimal, functional cookies. It does not store any tracking information. By using this site, you consent to this use of cookies. For more information, see our <a href="{url_for("views._privacy")}">privacy policy</a>.', 'cookie_alert')
|
||||||
|
|
||||||
|
@app.errorhandler(404)
|
||||||
|
def _404_handler(error): return render_template('404.html')
|
||||||
|
@app.errorhandler(CSRFError)
|
||||||
|
def _csrf_handler(): return jsonify({'error':'Could not validate a secure connection.'}), 403
|
||||||
|
@app.context_processor
|
||||||
|
def _now(): return {'now': datetime.now()}
|
||||||
|
|
||||||
|
from .admin.views import admin
|
||||||
|
from .api.views import api
|
||||||
|
from .quiz.views import quiz
|
||||||
|
from .views import views
|
||||||
|
|
||||||
|
app.register_blueprint(admin, url_prefix='/admin')
|
||||||
|
app.register_blueprint(api, url_prefix='/api')
|
||||||
|
app.register_blueprint(views)
|
||||||
|
app.register_blueprint(quiz)
|
||||||
|
|
||||||
|
install_app(app)
|
||||||
|
|
||||||
|
return app
|
@ -375,7 +375,7 @@ def _view_entry(id:str=None):
|
|||||||
@admin.route('/certificate/',methods=['POST'])
|
@admin.route('/certificate/',methods=['POST'])
|
||||||
@login_required
|
@login_required
|
||||||
def _generate_certificate():
|
def _generate_certificate():
|
||||||
from main import db
|
from ..extensions import db
|
||||||
id = request.get_json()['id']
|
id = request.get_json()['id']
|
||||||
entry = Entry.query.filter_by(id=id).first()
|
entry = Entry.query.filter_by(id=id).first()
|
||||||
if not entry: return jsonify({'error': 'Invalid entry ID.'}), 404
|
if not entry: return jsonify({'error': 'Invalid entry ID.'}), 404
|
||||||
|
33
ref-test/app/install.py
Normal file
33
ref-test/app/install.py
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
from .extensions import db
|
||||||
|
from .tools.data import save
|
||||||
|
from .tools.logs import write
|
||||||
|
|
||||||
|
from sqlalchemy_utils import create_database, database_exists
|
||||||
|
|
||||||
|
from cryptography.fernet import Fernet
|
||||||
|
from os import mkdir, path
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
def install_app(app):
|
||||||
|
with app.app_context():
|
||||||
|
data = Path(app.config.get('DATA'))
|
||||||
|
database_uri = app.config.get('SQLALCHEMY_DATABASE_URI')
|
||||||
|
if not path.isdir(f'./{data}'): mkdir(f'./{data}')
|
||||||
|
if not path.isdir(f'./{data}/questions'): mkdir(f'./{data}/questions')
|
||||||
|
if not path.isfile(f'./{data}/.gitignore'):
|
||||||
|
with open(f'./{data}/.gitignore', 'a+') as file: file.write(f'*')
|
||||||
|
if not path.isfile(f'./{data}/config.json'): save({}, 'config.json')
|
||||||
|
if not path.isdir(f'./{data}/logs'): mkdir(f'./{data}/logs')
|
||||||
|
if not path.isfile(f'./{data}/logs/users.log'): write('users.log', 'Log file created.')
|
||||||
|
if not path.isfile(f'./{data}/logs/system.log'): write('system.log', 'Log file created.')
|
||||||
|
if not path.isfile(f'./{data}/logs/tests.log'): write('tests.log', 'Log file created.')
|
||||||
|
if not database_exists(database_uri):
|
||||||
|
create_database(database_uri)
|
||||||
|
write('system.log', 'No database found. Creating a new database.')
|
||||||
|
db.create_all()
|
||||||
|
write('system.log', 'Creating database schema.')
|
||||||
|
if not path.isfile(f'./{data}/.encryption.key'):
|
||||||
|
write('system.log', 'No encryption key found. Generating new encryption key.')
|
||||||
|
with open(f'./{data}/.encryption.key', 'wb') as key_file:
|
||||||
|
key = Fernet.generate_key()
|
||||||
|
key_file.write(key)
|
@ -1,84 +1,3 @@
|
|||||||
from app.config import Development as Config
|
from app import create_app
|
||||||
from app.models import Entry, Dataset, Test, User
|
|
||||||
from app.extensions import bootstrap, csrf, db, login_manager, mail
|
|
||||||
from app.tools.data import save
|
|
||||||
from app.tools.logs import write
|
|
||||||
|
|
||||||
from flask import flash, Flask, render_template, request
|
|
||||||
from flask.helpers import url_for
|
|
||||||
from flask.json import jsonify
|
|
||||||
from flask_wtf.csrf import CSRFError
|
|
||||||
from sqlalchemy_utils import database_exists, create_database
|
|
||||||
from werkzeug.middleware.proxy_fix import ProxyFix
|
|
||||||
|
|
||||||
from cryptography.fernet import Fernet
|
|
||||||
from datetime import datetime
|
|
||||||
from os import mkdir, path
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
def create_app():
|
|
||||||
app = Flask(__name__)
|
|
||||||
app.config.from_object(Config())
|
|
||||||
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto= 1, x_host= 1)
|
|
||||||
|
|
||||||
bootstrap.init_app(app)
|
|
||||||
csrf.init_app(app)
|
|
||||||
db.init_app(app)
|
|
||||||
login_manager.init_app(app)
|
|
||||||
mail.init_app(app)
|
|
||||||
|
|
||||||
login_manager.login_view = 'admin._login'
|
|
||||||
@login_manager.user_loader
|
|
||||||
def _load_user(id):
|
|
||||||
return User.query.filter_by(id=id).first()
|
|
||||||
|
|
||||||
@app.before_request
|
|
||||||
def _check_cookie_consent():
|
|
||||||
if request.cookies.get('cookie_consent'):
|
|
||||||
return
|
|
||||||
if any([ request.path.startswith(x) for x in [ '/admin/static/', '/root/', '/quiz/static', '/cookies/' ] ]):
|
|
||||||
return
|
|
||||||
flash(f'<strong>Cookie Consent</strong>: This web site only stores minimal, functional cookies. It does not store any tracking information. By using this site, you consent to this use of cookies. For more information, see our <a href="{url_for("views._privacy")}">privacy policy</a>.', 'cookie_alert')
|
|
||||||
|
|
||||||
@app.errorhandler(404)
|
|
||||||
def _404_handler(error): return render_template('404.html')
|
|
||||||
@app.errorhandler(CSRFError)
|
|
||||||
def _csrf_handler(): return jsonify({'error':'Could not validate a secure connection.'}), 403
|
|
||||||
@app.context_processor
|
|
||||||
def _now(): return {'now': datetime.now()}
|
|
||||||
|
|
||||||
from app.admin.views import admin
|
|
||||||
from app.api.views import api
|
|
||||||
from app.quiz.views import quiz
|
|
||||||
from app.views import views
|
|
||||||
|
|
||||||
app.register_blueprint(admin, url_prefix='/admin')
|
|
||||||
app.register_blueprint(api, url_prefix='/api')
|
|
||||||
app.register_blueprint(views)
|
|
||||||
app.register_blueprint(quiz)
|
|
||||||
|
|
||||||
data = Path(app.config.get('DATA'))
|
|
||||||
if not path.isdir(f'./{data}'): mkdir(f'./{data}')
|
|
||||||
if not path.isdir(f'./{data}/questions'): mkdir(f'./{data}/questions')
|
|
||||||
if not path.isfile(f'./{data}/.gitignore'):
|
|
||||||
with open(f'./{data}/.gitignore', 'a+') as file: file.write(f'*')
|
|
||||||
if not path.isfile(f'./{data}/config.json'): save({}, 'config.json')
|
|
||||||
if not path.isdir(f'./{data}/logs'): mkdir(f'./{data}/logs')
|
|
||||||
if not path.isfile(f'./{data}/logs/users.log'): write('users.log', 'Log file created.')
|
|
||||||
if not path.isfile(f'./{data}/logs/system.log'): write('system.log', 'Log file created.')
|
|
||||||
if not path.isfile(f'./{data}/logs/tests.log'): write('tests.log', 'Log file created.')
|
|
||||||
if not database_exists(Config.SQLALCHEMY_DATABASE_URI):
|
|
||||||
create_database(Config.SQLALCHEMY_DATABASE_URI)
|
|
||||||
write('system.log', 'No database found. Creating a new database.')
|
|
||||||
with app.app_context(): db.create_all()
|
|
||||||
write('system.log', 'Creating database schema.')
|
|
||||||
if not path.isfile(f'./{data}/.encryption.key'):
|
|
||||||
write('system.log', 'No encryption key found. Generating new encryption key.')
|
|
||||||
with open(f'./{data}/.encryption.key', 'wb') as key_file:
|
|
||||||
key = Fernet.generate_key()
|
|
||||||
key_file.write(key)
|
|
||||||
return app
|
|
||||||
|
|
||||||
app = create_app()
|
app = create_app()
|
||||||
|
|
||||||
if __name__ == '__main__': app.run()
|
if __name__ == '__main__': app.run()
|
Loading…
Reference in New Issue
Block a user