63 lines
2.4 KiB
Python
63 lines
2.4 KiB
Python
from .config import Production as Config
|
|
from .models import User
|
|
from .extensions import bootstrap, csrf, db, login_manager, mail
|
|
from .tools.logs import write
|
|
|
|
from flask import flash, Flask, render_template, request
|
|
from flask.helpers import abort, url_for
|
|
from flask.json import jsonify
|
|
from flask_wtf.csrf import CSRFError
|
|
from sqlalchemy.exc import SQLAlchemyError
|
|
from werkzeug.middleware.proxy_fix import ProxyFix
|
|
|
|
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):
|
|
try: return User.query.filter_by(id=id).first()
|
|
except SQLAlchemyError as exception:
|
|
write('system.log', f'Database error when loading user fo login manager: {exception}')
|
|
return abort(500)
|
|
|
|
@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/', '/admin/editor/static', '/admin/view/static' ] ]):
|
|
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
|
|
from .editor.views import editor
|
|
from .view.views import view
|
|
|
|
app.register_blueprint(admin, url_prefix='/admin')
|
|
app.register_blueprint(api, url_prefix='/api')
|
|
app.register_blueprint(views)
|
|
app.register_blueprint(quiz)
|
|
app.register_blueprint(editor, url_prefix='/admin/editor')
|
|
app.register_blueprint(view, url_prefix='/admin/view')
|
|
|
|
return app |