import os import flask_assets from flask import Flask from flask_flatpages import FlatPages from werkzeug.utils import cached_property class CustomFlatPages(FlatPages): def __init__(self, app=None, name=None): super(CustomFlatPages, self).__init__(app=app, name=name) self.app = app @cached_property def _pages(self): """Forget all pages and nuke our own cache""" try: del app.__dict__['journal_entries'] del app.__dict__['journal_tags'] except KeyError: pass return super(CustomFlatPages, self)._pages class CustomFlask(Flask): def __init__(self, *args, **kwargs): super(CustomFlask, self).__init__(*args, **kwargs) config = { 'default': 'kyrias_website.config.BaseConfig', 'development': 'kyrias_website.config.DevelopmentConfig', } config_name = os.getenv('WEBSITE_CONFIGURATION', 'default') self.config.from_object(config[config_name]) assets = flask_assets.Environment(self) css = flask_assets.Bundle('base.css', filters='cssmin', output='screen.css') assets.register('css_all', css) self.pages = CustomFlatPages(self, 'pages') self.journal = CustomFlatPages(self, 'journal') @cached_property def journal_entries(self): return sorted(self.journal, key=lambda x: x.meta.get('date')) @cached_property def journal_tags(self): tags = {} for entry in self.journal_entries: if 'tags' not in entry.meta: tags.setdefault('untagged', set()).add(entry) else: for tag in entry.meta.get('tags'): tags.setdefault(tag, set()).add(entry) return tags app = CustomFlask(__name__) import kyrias_website.views if __name__ == '__main__': app.run(port=5000)