#! /data/project/copyvios/env/bin/python # -*- coding: utf-8 -*- from functools import wraps from logging import DEBUG from logging.handlers import TimedRotatingFileHandler from time import asctime from traceback import format_exc from earwigbot.bot import Bot from flask import Flask, g, request from flask.ext.mako import MakoTemplates, render_template, TemplateError from flup.server.fcgi import WSGIServer from copyvios.checker import do_check from copyvios.cookies import parse_cookies from copyvios.settings import process_settings from copyvios.sites import get_sites app = Flask(__name__) MakoTemplates(app) app.logger.setLevel(DEBUG) app.logger.addHandler(TimedRotatingFileHandler( "logs/app.log", when="midnight", backupCount=7)) app.logger.info(u"Flask server started " + asctime()) bot = Bot(".earwigbot", 100) def catch_errors(func): @wraps(func) def inner(*args, **kwargs): try: return func(*args, **kwargs) except TemplateError as exc: return render_template("error.mako", traceback=exc.text) except Exception: return render_template("error.mako", traceback=format_exc()) return inner @app.before_request def prepare_request(): g.bot = bot g.globals_db = g.cache_db = None g.cookies = parse_cookies(request.script_root, request.environ.get("HTTP_COOKIE")) g.new_cookies = [] @app.after_request def add_new_cookies(response): for cookie in g.new_cookies: response.headers.add("Set-Cookie", cookie) return response @app.after_request def write_access_log(response): msg = u"%s %s %s %s -> %s" app.logger.debug(msg, asctime(), request.method, request.path, request.values.to_dict(), response.status_code) return response @app.teardown_appcontext def close_databases(error): if g.globals_db: g.globals_db.close() if g.cache_db: g.cache_db.close() @app.route("/") @catch_errors def index(): query = do_check() return render_template("index.mako", query=query, result=query.result) @app.route("/settings", methods=["GET", "POST"]) @catch_errors def settings(): status = process_settings() if request.method == "POST" else None langs, projects = get_sites() default = bot.wiki.get_site() kwargs = {"status": status, "langs": langs, "projects": projects, "default_lang": default.lang, "default_project": default.project} return render_template("settings.mako", **kwargs) if __name__ == '__main__': WSGIServer(app).run()