From 9dcd5561526ef25aae72f3c878223668ec7023df Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Wed, 23 Jul 2014 12:39:58 -0700 Subject: [PATCH] Reorganize module structure --- rophako/__init__.py | 167 ++------------------------------------------ rophako/app.py | 160 ++++++++++++++++++++++++++++++++++++++++++ runserver.py | 2 +- 3 files changed, 168 insertions(+), 161 deletions(-) create mode 100644 rophako/app.py diff --git a/rophako/__init__.py b/rophako/__init__.py index 81f2408..4979df3 100644 --- a/rophako/__init__.py +++ b/rophako/__init__.py @@ -1,161 +1,8 @@ -__version__ = '0.01' +#!/usr/bin/env python -from flask import Flask, g, request, session, render_template, send_file, abort -from flask_sslify import SSLify -import jinja2 -import os.path -import time -import sys - -import config -import rophako.utils - -app = Flask(__name__, - static_url_path="/.static", -) -app.DEBUG = config.DEBUG -app.secret_key = config.SECRET_KEY - -# Security? -if config.FORCE_SSL: - app.config['SESSION_COOKIE_SECURE'] = True - sslify = SSLify(app) - -# Load all the blueprints! -from rophako.modules.admin import mod as AdminModule -from rophako.modules.account import mod as AccountModule -from rophako.modules.blog import mod as BlogModule -from rophako.modules.photo import mod as PhotoModule -from rophako.modules.comment import mod as CommentModule -from rophako.modules.emoticons import mod as EmoticonsModule -from rophako.modules.contact import mod as ContactModule -app.register_blueprint(AdminModule) -app.register_blueprint(AccountModule) -app.register_blueprint(BlogModule) -app.register_blueprint(PhotoModule) -app.register_blueprint(CommentModule) -app.register_blueprint(EmoticonsModule) -app.register_blueprint(ContactModule) - -# Custom Jinja handler to support custom- and default-template folders for -# rendering templates. -app.jinja_loader = jinja2.ChoiceLoader([ - jinja2.FileSystemLoader(config.SITE_ROOT), # Site specific. - jinja2.FileSystemLoader("rophako/www"), # Default/fall-back -]) - -app.jinja_env.globals["csrf_token"] = rophako.utils.generate_csrf_token -app.jinja_env.globals["include_page"] = rophako.utils.include - -# Preload the emoticon data. -import rophako.model.emoticons as Emoticons -Emoticons.load_theme() - - -@app.before_request -def before_request(): - """Called before all requests. Initialize global template variables.""" - - # Default template vars. - g.info = { - "time": time.time(), - "app": { - "name": "Rophako", - "version": __version__, - "python_version": "{}.{}".format(sys.version_info.major, sys.version_info.minor), - "author": "Noah Petherbridge", - "photo_url": config.PHOTO_ROOT_PUBLIC, - }, - "uri": request.path, - "session": { - "login": False, # Not logged in, until proven otherwise. - "username": "guest", - "uid": 0, - "name": "Guest", - "role": "user", - } - } - - # Default session vars. - if not "login" in session: - session.update(g.info["session"]) - - # CSRF protection. - if request.method == "POST": - token = session.pop("_csrf", None) - if not token or str(token) != str(request.form.get("token")): - abort(403) - - # Refresh their login status from the DB. - if session["login"]: - import rophako.model.user as User - if not User.exists(uid=session["uid"]): - # Weird! Log them out. - from rophako.modules.account import logout - logout() - return - - db = User.get_user(uid=session["uid"]) - session["username"] = db["username"] - session["name"] = db["name"] - session["role"] = db["role"] - - # Copy session params into g.info. The only people who should touch the - # session are the login/out pages. - for key in session: - g.info["session"][key] = session[key] - - -@app.context_processor -def after_request(): - """Called just before render_template. Inject g.info into the template vars.""" - return g.info - - -@app.route("/") -def catchall(path): - """The catch-all path handler. If it exists in the www folders, it's sent, - otherwise we give the 404 error page.""" - - # Search for this file. - for root in [config.SITE_ROOT, "rophako/www"]: - abspath = os.path.abspath("{}/{}".format(root, path)) - if os.path.isfile(abspath): - return send_file(abspath) - - # The exact file wasn't found, look for some extensions and index pages. - suffixes = [ - ".html", - "/index.html", - ".md", # Markdown formatted pages. - "/index.md", - ] - for suffix in suffixes: - if not "." in path and os.path.isfile(abspath + suffix): - # HTML, or Markdown? - if suffix.endswith(".html"): - return rophako.utils.template(path + suffix) - else: - return rophako.utils.markdown_template(abspath + suffix) - - return not_found("404") - - -@app.route("/") -def index(): - return catchall("index") - - -@app.errorhandler(404) -def not_found(error): - return render_template('errors/404.html', **g.info), 404 - - -@app.errorhandler(403) -def forbidden(error): - return render_template('errors/403.html', **g.info), 403 - - -# Domain specific endpoints. -if config.SITE_NAME == "kirsle.net": - import rophako.modules.kirsle_legacy +__title__ = "Rophako" +__version__ = "0.01" +__author__ = "Noah Petherbridge" +__email__ = "root@kirsle.net" +__description__ = "A content management system designed for kirsle.net" +__license__ = "GPL" \ No newline at end of file diff --git a/rophako/app.py b/rophako/app.py new file mode 100644 index 0000000..29c8714 --- /dev/null +++ b/rophako/app.py @@ -0,0 +1,160 @@ +from flask import Flask, g, request, session, render_template, send_file, abort +from flask_sslify import SSLify +import jinja2 +import os.path +import time +import sys + +import config +from rophako import __version__ +import rophako.utils + +app = Flask(__name__, + static_url_path="/.static", +) +app.DEBUG = config.DEBUG +app.secret_key = config.SECRET_KEY + +# Security? +if config.FORCE_SSL: + app.config['SESSION_COOKIE_SECURE'] = True + sslify = SSLify(app) + +# Load all the blueprints! +from rophako.modules.admin import mod as AdminModule +from rophako.modules.account import mod as AccountModule +from rophako.modules.blog import mod as BlogModule +from rophako.modules.photo import mod as PhotoModule +from rophako.modules.comment import mod as CommentModule +from rophako.modules.emoticons import mod as EmoticonsModule +from rophako.modules.contact import mod as ContactModule +app.register_blueprint(AdminModule) +app.register_blueprint(AccountModule) +app.register_blueprint(BlogModule) +app.register_blueprint(PhotoModule) +app.register_blueprint(CommentModule) +app.register_blueprint(EmoticonsModule) +app.register_blueprint(ContactModule) + +# Custom Jinja handler to support custom- and default-template folders for +# rendering templates. +app.jinja_loader = jinja2.ChoiceLoader([ + jinja2.FileSystemLoader(config.SITE_ROOT), # Site specific. + jinja2.FileSystemLoader("rophako/www"), # Default/fall-back +]) + +app.jinja_env.globals["csrf_token"] = rophako.utils.generate_csrf_token +app.jinja_env.globals["include_page"] = rophako.utils.include + +# Preload the emoticon data. +import rophako.model.emoticons as Emoticons +Emoticons.load_theme() + + +@app.before_request +def before_request(): + """Called before all requests. Initialize global template variables.""" + + # Default template vars. + g.info = { + "time": time.time(), + "app": { + "name": "Rophako", + "version": __version__, + "python_version": "{}.{}".format(sys.version_info.major, sys.version_info.minor), + "author": "Noah Petherbridge", + "photo_url": config.PHOTO_ROOT_PUBLIC, + }, + "uri": request.path, + "session": { + "login": False, # Not logged in, until proven otherwise. + "username": "guest", + "uid": 0, + "name": "Guest", + "role": "user", + } + } + + # Default session vars. + if not "login" in session: + session.update(g.info["session"]) + + # CSRF protection. + if request.method == "POST": + token = session.pop("_csrf", None) + if not token or str(token) != str(request.form.get("token")): + abort(403) + + # Refresh their login status from the DB. + if session["login"]: + import rophako.model.user as User + if not User.exists(uid=session["uid"]): + # Weird! Log them out. + from rophako.modules.account import logout + logout() + return + + db = User.get_user(uid=session["uid"]) + session["username"] = db["username"] + session["name"] = db["name"] + session["role"] = db["role"] + + # Copy session params into g.info. The only people who should touch the + # session are the login/out pages. + for key in session: + g.info["session"][key] = session[key] + + +@app.context_processor +def after_request(): + """Called just before render_template. Inject g.info into the template vars.""" + return g.info + + +@app.route("/") +def catchall(path): + """The catch-all path handler. If it exists in the www folders, it's sent, + otherwise we give the 404 error page.""" + + # Search for this file. + for root in [config.SITE_ROOT, "rophako/www"]: + abspath = os.path.abspath("{}/{}".format(root, path)) + if os.path.isfile(abspath): + return send_file(abspath) + + # The exact file wasn't found, look for some extensions and index pages. + suffixes = [ + ".html", + "/index.html", + ".md", # Markdown formatted pages. + "/index.md", + ] + for suffix in suffixes: + if not "." in path and os.path.isfile(abspath + suffix): + # HTML, or Markdown? + if suffix.endswith(".html"): + return rophako.utils.template(path + suffix) + else: + return rophako.utils.markdown_template(abspath + suffix) + + return not_found("404") + + +@app.route("/") +def index(): + return catchall("index") + + +@app.errorhandler(404) +def not_found(error): + return render_template('errors/404.html', **g.info), 404 + + +@app.errorhandler(403) +def forbidden(error): + return render_template('errors/403.html', **g.info), 403 + + +# Domain specific endpoints. +if config.SITE_NAME == "kirsle.net": + import rophako.modules.kirsle_legacy \ No newline at end of file diff --git a/runserver.py b/runserver.py index a9e67a5..ea9f846 100644 --- a/runserver.py +++ b/runserver.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import sys import argparse -from rophako import app +from rophako.app import app parser = argparse.ArgumentParser(description="Rophako") parser.add_argument(