diff options
author | 2018-02-05 20:15:01 +0000 | |
---|---|---|
committer | 2018-02-05 20:15:01 +0000 | |
commit | f0f347b01734b719bae0d36a8670fd7e49866b1e (patch) | |
tree | 4d9cf54e44b7fea4124389098fd0fa37a17cdad9 /pysite | |
parent | Minifix (diff) |
Revert "Major update"
This reverts commit 80a1ab5
Diffstat (limited to 'pysite')
-rw-r--r-- | pysite/__init__.py | 3 | ||||
-rw-r--r-- | pysite/base_route.py | 29 | ||||
-rw-r--r-- | pysite/route_manager.py | 41 | ||||
-rw-r--r-- | pysite/views/__init__.py | 3 | ||||
-rw-r--r-- | pysite/views/error_handlers/__init__.py | 3 | ||||
-rw-r--r-- | pysite/views/error_handlers/http_404.py | 14 | ||||
-rw-r--r-- | pysite/views/healthcheck.py | 15 | ||||
-rw-r--r-- | pysite/views/index.py | 12 | ||||
-rw-r--r-- | pysite/views/invite.py | 15 |
9 files changed, 135 insertions, 0 deletions
diff --git a/pysite/__init__.py b/pysite/__init__.py new file mode 100644 index 00000000..ba286add --- /dev/null +++ b/pysite/__init__.py @@ -0,0 +1,3 @@ +# coding=utf-8 + +__author__ = "Gareth Coles" diff --git a/pysite/base_route.py b/pysite/base_route.py new file mode 100644 index 00000000..76338280 --- /dev/null +++ b/pysite/base_route.py @@ -0,0 +1,29 @@ +# coding=utf-8 +from flask import Flask +from flask.views import MethodView + +__author__ = "Gareth Coles" + + +class BaseView(MethodView): + path = None #: str + name = None #: str + + @classmethod + def setup(cls: "BaseView", app: Flask): + 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)) + + +class ErrorView(MethodView): + name = None #: str + error_code = None #: int + + @classmethod + def setup(cls: "ErrorView", app: Flask): + 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, 404, cls.as_view(cls.name)) diff --git a/pysite/route_manager.py b/pysite/route_manager.py new file mode 100644 index 00000000..501076b7 --- /dev/null +++ b/pysite/route_manager.py @@ -0,0 +1,41 @@ +# coding=utf-8 +import importlib +import inspect +import os + +from flask import Flask + +from pysite.base_route import BaseView, ErrorView + +__author__ = "Gareth Coles" + + +class RouteManager: + def __init__(self): + self.app = Flask(__name__) + self.app.secret_key = os.environ.get("WEBPAGE_SECRET_KEY") + + self.load_views() + + def run(self): + self.app.run(port=int(os.environ.get("WEBPAGE_PORT")), debug=False) + + def load_views(self, 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}") + continue + + if filename.endswith(".py") and not filename.startswith("__init__"): + module = importlib.import_module(f"{location}/{filename}".replace("/", ".")[:-3]) + + for cls_name, cls in inspect.getmembers(module): + if ( + inspect.isclass(cls) and + cls is not BaseView and + cls is not ErrorView and + (BaseView in cls.__mro__ or ErrorView in cls.__mro__) + ): + cls.setup(self.app) + print(f"View loaded: {cls.name: <25} ({module.__name__}.{cls_name})") diff --git a/pysite/views/__init__.py b/pysite/views/__init__.py new file mode 100644 index 00000000..ba286add --- /dev/null +++ b/pysite/views/__init__.py @@ -0,0 +1,3 @@ +# coding=utf-8 + +__author__ = "Gareth Coles" diff --git a/pysite/views/error_handlers/__init__.py b/pysite/views/error_handlers/__init__.py new file mode 100644 index 00000000..ba286add --- /dev/null +++ b/pysite/views/error_handlers/__init__.py @@ -0,0 +1,3 @@ +# coding=utf-8 + +__author__ = "Gareth Coles" diff --git a/pysite/views/error_handlers/http_404.py b/pysite/views/error_handlers/http_404.py new file mode 100644 index 00000000..eea1e630 --- /dev/null +++ b/pysite/views/error_handlers/http_404.py @@ -0,0 +1,14 @@ +# coding=utf-8 +from werkzeug.exceptions import NotFound + +from pysite.base_route import ErrorView + +__author__ = "Gareth Coles" + + +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 new file mode 100644 index 00000000..660c8a96 --- /dev/null +++ b/pysite/views/healthcheck.py @@ -0,0 +1,15 @@ +# coding=utf-8 +from flask import jsonify + +from pysite.base_route import BaseView + + +__author__ = "Gareth Coles" + + +class IndexView(BaseView): + path = "/healthcheck" + name = "healthcheck" + + def get(self): + return jsonify({"status": "ok"}) diff --git a/pysite/views/index.py b/pysite/views/index.py new file mode 100644 index 00000000..2e779003 --- /dev/null +++ b/pysite/views/index.py @@ -0,0 +1,12 @@ +# coding=utf-8 +from pysite.base_route import BaseView + +__author__ = "Gareth Coles" + + +class IndexView(BaseView): + path = "/" + name = "index" + + def get(self): + return "Coming soon:tm:" diff --git a/pysite/views/invite.py b/pysite/views/invite.py new file mode 100644 index 00000000..d035fc99 --- /dev/null +++ b/pysite/views/invite.py @@ -0,0 +1,15 @@ +# coding=utf-8 +from flask import redirect + +from pysite.base_route import BaseView + + +__author__ = "Gareth Coles" + + +class InviteView(BaseView): + path = "/invite" + name = "invite" + + def get(self): + return redirect("http://invite.pythondiscord.com/") |