From b38a9f56e54eb21eec37f40075399961ba82906f Mon Sep 17 00:00:00 2001 From: Gareth Coles Date: Fri, 9 Feb 2018 12:19:55 +0000 Subject: Move from straight app registration to Blueprints (#6) --- pysite/base_route.py | 10 +++++----- pysite/route_manager.py | 24 ++++++++++++++++++------ pysite/views/__init__.py | 1 - pysite/views/api/__init__.py | 1 + pysite/views/api/healthcheck.py | 12 ++++++++++++ pysite/views/error_handlers/__init__.py | 1 - pysite/views/error_handlers/http_404.py | 12 ------------ pysite/views/healthcheck.py | 12 ------------ pysite/views/index.py | 10 ---------- pysite/views/invite.py | 12 ------------ pysite/views/main/__init__.py | 1 + pysite/views/main/error_handlers/__init__.py | 1 + pysite/views/main/error_handlers/http_404.py | 12 ++++++++++++ pysite/views/main/index.py | 10 ++++++++++ pysite/views/main/invite.py | 12 ++++++++++++ 15 files changed, 72 insertions(+), 59 deletions(-) delete mode 100644 pysite/views/__init__.py create mode 100644 pysite/views/api/__init__.py create mode 100644 pysite/views/api/healthcheck.py delete mode 100644 pysite/views/error_handlers/__init__.py delete mode 100644 pysite/views/error_handlers/http_404.py delete mode 100644 pysite/views/healthcheck.py delete mode 100644 pysite/views/index.py delete mode 100644 pysite/views/invite.py create mode 100644 pysite/views/main/__init__.py create mode 100644 pysite/views/main/error_handlers/__init__.py create mode 100644 pysite/views/main/error_handlers/http_404.py create mode 100644 pysite/views/main/index.py create mode 100644 pysite/views/main/invite.py diff --git a/pysite/base_route.py b/pysite/base_route.py index 916e7fae..8274e66f 100644 --- a/pysite/base_route.py +++ b/pysite/base_route.py @@ -1,5 +1,5 @@ # coding=utf-8 -from flask import Flask, render_template +from flask import Blueprint, render_template from flask.views import MethodView @@ -17,19 +17,19 @@ class RouteView(BaseView): path = None # type: str @classmethod - def setup(cls: "RouteView", app: Flask): + def setup(cls: "RouteView", blueprint: Blueprint): if not cls.path or not cls.name: raise RuntimeError("Route views must have both `path` and `name` defined") - app.add_url_rule(cls.path, view_func=cls.as_view(cls.name)) + blueprint.add_url_rule(cls.path, view_func=cls.as_view(cls.name)) class ErrorView(BaseView): error_code = None # type: int @classmethod - def setup(cls: "ErrorView", app: Flask): + def setup(cls: "ErrorView", blueprint: Blueprint): if not cls.name or not cls.error_code: raise RuntimeError("Error views must have both `name` and `error_code` defined") - app._register_error_handler(None, cls.error_code, cls.as_view(cls.name)) + blueprint.errorhandler(cls.error_code)(cls.as_view(cls.name)) diff --git a/pysite/route_manager.py b/pysite/route_manager.py index ed0947f8..6ed597b1 100644 --- a/pysite/route_manager.py +++ b/pysite/route_manager.py @@ -3,7 +3,7 @@ import importlib import inspect import os -from flask import Flask, abort, g +from flask import Blueprint, Flask, abort, g import rethinkdb @@ -25,18 +25,30 @@ class RouteManager: ) self.app.secret_key = os.environ.get("WEBPAGE_SECRET_KEY") - self.load_views() + self.main_blueprint = Blueprint("main", __name__) + + print(f"Loading Blueprint: {self.main_blueprint.name}") + self.load_views(self.main_blueprint, "pysite/views/main") + self.app.register_blueprint(self.main_blueprint) + print("") + + self.api_blueprint = Blueprint("api", __name__, subdomain="api") + + print(f"Loading Blueprint: {self.api_blueprint.name}") + self.load_views(self.api_blueprint, "pysite/views/api") + self.app.register_blueprint(self.api_blueprint) + print("") def run(self): self.app.run( port=int(os.environ.get("WEBPAGE_PORT")), debug="FLASK_DEBUG" in os.environ ) - def load_views(self, location="pysite/views"): + def load_views(self, blueprint, location="pysite/views"): for filename in os.listdir(location): if os.path.isdir(f"{location}/{filename}"): # Recurse if it's a directory; load ALL the views! - self.load_views(location=f"{location}/{filename}") + self.load_views(blueprint, location=f"{location}/{filename}") continue if filename.endswith(".py") and not filename.startswith("__init__"): @@ -50,8 +62,8 @@ class RouteManager: cls is not RouteView and BaseView in cls.__mro__ ): - cls.setup(self.app) - print(f"View loaded: {cls.name: <25} ({module.__name__}.{cls_name})") + cls.setup(blueprint) + print(f">> View loaded: {cls.name: <15} ({module.__name__}.{cls_name})") def setup_db(self): connection = self.get_db_connection(connect_database=False) diff --git a/pysite/views/__init__.py b/pysite/views/__init__.py deleted file mode 100644 index 9bad5790..00000000 --- a/pysite/views/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# coding=utf-8 diff --git a/pysite/views/api/__init__.py b/pysite/views/api/__init__.py new file mode 100644 index 00000000..9bad5790 --- /dev/null +++ b/pysite/views/api/__init__.py @@ -0,0 +1 @@ +# coding=utf-8 diff --git a/pysite/views/api/healthcheck.py b/pysite/views/api/healthcheck.py new file mode 100644 index 00000000..9d1f681a --- /dev/null +++ b/pysite/views/api/healthcheck.py @@ -0,0 +1,12 @@ +# coding=utf-8 +from flask import jsonify + +from pysite.base_route import RouteView + + +class IndexView(RouteView): + path = "/healthcheck" + name = "healthcheck" + + def get(self): + return jsonify({"status": "ok"}) diff --git a/pysite/views/error_handlers/__init__.py b/pysite/views/error_handlers/__init__.py deleted file mode 100644 index 9bad5790..00000000 --- a/pysite/views/error_handlers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# coding=utf-8 diff --git a/pysite/views/error_handlers/http_404.py b/pysite/views/error_handlers/http_404.py deleted file mode 100644 index 1d557d9b..00000000 --- a/pysite/views/error_handlers/http_404.py +++ /dev/null @@ -1,12 +0,0 @@ -# coding=utf-8 -from werkzeug.exceptions import NotFound - -from pysite.base_route import ErrorView - - -class Error404View(ErrorView): - name = "error_404" - error_code = 404 - - def get(self, error: NotFound): - return "replace me with a template, 404 not found", 404 diff --git a/pysite/views/healthcheck.py b/pysite/views/healthcheck.py deleted file mode 100644 index 9d1f681a..00000000 --- a/pysite/views/healthcheck.py +++ /dev/null @@ -1,12 +0,0 @@ -# coding=utf-8 -from flask import jsonify - -from pysite.base_route import RouteView - - -class IndexView(RouteView): - path = "/healthcheck" - name = "healthcheck" - - def get(self): - return jsonify({"status": "ok"}) diff --git a/pysite/views/index.py b/pysite/views/index.py deleted file mode 100644 index 0c2d1578..00000000 --- a/pysite/views/index.py +++ /dev/null @@ -1,10 +0,0 @@ -# coding=utf-8 -from pysite.base_route import RouteView - - -class IndexView(RouteView): - path = "/" - name = "index" - - def get(self): - return self.render("index.html") diff --git a/pysite/views/invite.py b/pysite/views/invite.py deleted file mode 100644 index 9563a5e6..00000000 --- a/pysite/views/invite.py +++ /dev/null @@ -1,12 +0,0 @@ -# coding=utf-8 -from flask import redirect - -from pysite.base_route import RouteView - - -class InviteView(RouteView): - path = "/invite" - name = "invite" - - def get(self): - return redirect("http://invite.pythondiscord.com/") diff --git a/pysite/views/main/__init__.py b/pysite/views/main/__init__.py new file mode 100644 index 00000000..9bad5790 --- /dev/null +++ b/pysite/views/main/__init__.py @@ -0,0 +1 @@ +# coding=utf-8 diff --git a/pysite/views/main/error_handlers/__init__.py b/pysite/views/main/error_handlers/__init__.py new file mode 100644 index 00000000..9bad5790 --- /dev/null +++ b/pysite/views/main/error_handlers/__init__.py @@ -0,0 +1 @@ +# coding=utf-8 diff --git a/pysite/views/main/error_handlers/http_404.py b/pysite/views/main/error_handlers/http_404.py new file mode 100644 index 00000000..1d557d9b --- /dev/null +++ b/pysite/views/main/error_handlers/http_404.py @@ -0,0 +1,12 @@ +# coding=utf-8 +from werkzeug.exceptions import NotFound + +from pysite.base_route import ErrorView + + +class Error404View(ErrorView): + name = "error_404" + error_code = 404 + + def get(self, error: NotFound): + return "replace me with a template, 404 not found", 404 diff --git a/pysite/views/main/index.py b/pysite/views/main/index.py new file mode 100644 index 00000000..0c2d1578 --- /dev/null +++ b/pysite/views/main/index.py @@ -0,0 +1,10 @@ +# coding=utf-8 +from pysite.base_route import RouteView + + +class IndexView(RouteView): + path = "/" + name = "index" + + def get(self): + return self.render("index.html") diff --git a/pysite/views/main/invite.py b/pysite/views/main/invite.py new file mode 100644 index 00000000..9563a5e6 --- /dev/null +++ b/pysite/views/main/invite.py @@ -0,0 +1,12 @@ +# coding=utf-8 +from flask import redirect + +from pysite.base_route import RouteView + + +class InviteView(RouteView): + path = "/invite" + name = "invite" + + def get(self): + return redirect("http://invite.pythondiscord.com/") -- cgit v1.2.3