Select Git revision
-
Jiří Setnička authoredJiří Setnička authored
__init__.py 2.38 KiB
from flask import Flask, request, g, session
import flask.logging
from flask_sqlalchemy import SQLAlchemy
import os
import locale
import logging
from flask_bootstrap import Bootstrap
import werkzeug.exceptions
import mo.config as config
import mo.db as db
import mo.users
# Aplikační objekt
app = Flask(__name__, instance_path=os.path.abspath('data'), static_folder=os.path.abspath('static'))
app.config.from_object(config)
app.jinja_options['extensions'].append('jinja2.ext.do')
app.jinja_env.lstrip_blocks = True
app.jinja_env.trim_blocks = True
db.flask_db = SQLAlchemy(app, metadata=db.metadata)
Bootstrap(app) # make bootstrap libs accessible for the app
# Nastavíme logování:
# - kořenový logger dostane flaskový handler, aby se logovaly hlášky ze všech komponent
# - app.logger (což Flask založil jako podřízený logger) nastavíme, aby nepropagoval výše
# FIXME: Ještě je potřeba dořešit, že flaskový development server loguje každý request dvojmo.
app.logger.setLevel(logging.DEBUG)
app.logger.propagate = False
root_logger = logging.getLogger()
root_logger.addHandler(flask.logging.default_handler)
root_logger.setLevel(logging.DEBUG)
# Budeme používat české locale
locale.setlocale(locale.LC_COLLATE, 'cs_CZ.UTF-8')
class NeedLoginError(werkzeug.exceptions.Forbidden):
description = 'Need to log in'
def need_login():
if not g.user:
raise NeedLoginError()
def init_request():
if 'uid' in session:
user = mo.users.user_by_uid(session['uid'])
if not user:
# Uživatel mezitím přestal existovat
app.logging.error('Zrušena session pro neexistujícího uživatele uid=%s', session['uid'])
return mo.web.main.logout()
else:
user = None
g.user = user
mo.util.current_log_user = user
# K některým podstromům je nutné mít speciální oprávnění
# XXX: Když celá aplikace běží v adresáři, request.path je relativní ke kořeni aplikace, ne celého webu
path = request.path
if path.startswith('/org/'):
if not user:
raise NeedLoginError()
if not (user.is_org or user.is_admin):
raise werkzeug.exceptions.Forbidden()
app.before_request(init_request)
# Většina webu je v samostatných modulech
import mo.web.main
import mo.web.org
import mo.web.org_contest
import mo.web.org_place
import mo.web.org_users
import mo.web.menu