view wikked/web.py @ 49:fb6ae96756c1

Added unit tests. Refactored core APIs to make them more testable. Removed unused stuff like caching the configuration in the SQL database. Fixed the web bootstrap. Some cosmetic changes to be PEP8 compliant.
author Ludovic Chabant <ludovic@chabant.com>
date Mon, 28 Jan 2013 23:13:04 -0800
parents 86ee1b696070
children 494f3c4660ed
line wrap: on
line source

from flask import Flask, abort, g
from wiki import Wiki, WikiParameters

# Create the main app.
app = Flask("wikked")
app.config.from_object('wikked.settings')
app.config.from_envvar('WIKKED_SETTINGS', silent=True)


def create_wiki():
    params = WikiParameters(root=app.config.get('WIKI_ROOT'))
    params.logger = app.logger
    wiki = Wiki(params)
    wiki.start()
    return wiki

wiki = create_wiki()


# Set the wiki as a request global, and open/close the database.
@app.before_request
def before_request():
    if getattr(wiki, 'db', None):
        wiki.db.open()
    g.wiki = wiki


@app.teardown_request
def teardown_request(exception):
    if wiki is not None:
        if getattr(wiki, 'db', None):
            wiki.db.close()


# Make is serve static content in DEBUG mode.
if app.config['DEBUG']:
    from werkzeug import SharedDataMiddleware
    import os
    app.wsgi_app = SharedDataMiddleware(app.wsgi_app, {
      '/': os.path.join(os.path.dirname(__file__), 'static')
    })


# Customize logging.
if app.config.get('LOG_FORMAT'):
    import logging
    handler = logging.StreamHandler()
    handler.setLevel(logging.DEBUG)
    handler.setFormatter(logging.Formatter(app.config['LOG_FORMAT']))
    app.logger.handlers = []
    app.logger.addHandler(handler)


# Login extension.
def user_loader(username):
    return g.wiki.auth.getUser(username)

from flask.ext.login import LoginManager
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.user_loader(user_loader)
login_manager.unauthorized_handler(lambda: abort(401))


# Bcrypt extension.
from flaskext.bcrypt import Bcrypt
app.bcrypt = Bcrypt(app)


# Import the views.
import views