aboutsummaryrefslogtreecommitdiffstats
path: root/pysite
diff options
context:
space:
mode:
authorGravatar Gareth Coles <[email protected]>2018-02-08 16:01:20 +0000
committerGravatar Gareth Coles <[email protected]>2018-02-08 16:01:20 +0000
commit428eb9a6afb85fca51e87f6d16a1044a5fa24bf8 (patch)
treeee991943fd2bb05a574d8ae035fb6fc5be3f8c52 /pysite
parentPffft (diff)
parentTravis deploy on master (#5) (diff)
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'pysite')
-rw-r--r--pysite/base_route.py22
-rw-r--r--pysite/route_manager.py59
-rw-r--r--pysite/views/healthcheck.py7
-rw-r--r--pysite/views/index.py6
-rw-r--r--pysite/views/invite.py7
5 files changed, 83 insertions, 18 deletions
diff --git a/pysite/base_route.py b/pysite/base_route.py
index 4fdad857..916e7fae 100644
--- a/pysite/base_route.py
+++ b/pysite/base_route.py
@@ -1,23 +1,31 @@
# coding=utf-8
-from flask import Flask
+from flask import Flask, render_template
from flask.views import MethodView
class BaseView(MethodView):
- path = None #: str
- name = None #: str
+ name = None # type: str
+
+ def render(self, *template_names, **context):
+ context["current_page"] = self.name
+ context["view"] = self
+
+ return render_template(template_names, **context)
+
+
+class RouteView(BaseView):
+ path = None # type: str
@classmethod
- def setup(cls: "BaseView", app: Flask):
+ def setup(cls: "RouteView", 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
+class ErrorView(BaseView):
+ error_code = None # type: int
@classmethod
def setup(cls: "ErrorView", app: Flask):
diff --git a/pysite/route_manager.py b/pysite/route_manager.py
index 5fe22ba0..09202d0c 100644
--- a/pysite/route_manager.py
+++ b/pysite/route_manager.py
@@ -3,20 +3,35 @@ import importlib
import inspect
import os
-from flask import Flask
+from flask import Flask, abort, g
from pysite.base_route import BaseView, ErrorView
+import rethinkdb
+
+from pysite.base_route import BaseView, ErrorView, RouteView
+
+DB_HOST = os.environ.get("RETHINKDB_HOST")
+DB_PORT = os.environ.get("RETHINKDB_PORT")
+DB_DATABASE = os.environ.get("RETHINKDB_DATABASE")
+DB_TABLE = os.environ.get("RETHINKDB_TABLE")
+
+TEMPLATES_PATH = "../templates"
+STATIC_PATH = "../static"
class RouteManager:
def __init__(self):
- self.app = Flask(__name__)
+ self.app = Flask(
+ __name__, template_folder=TEMPLATES_PATH, static_folder=STATIC_PATH, static_url_path="/static",
+ )
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)
+ self.app.run(
+ port=int(os.environ.get("WEBPAGE_PORT")), debug="FLASK_DEBUG" in os.environ
+ )
def load_views(self, location="pysite/views"):
for filename in os.listdir(location):
@@ -33,7 +48,43 @@ class RouteManager:
inspect.isclass(cls) and
cls is not BaseView and
cls is not ErrorView and
- (BaseView in cls.__mro__ or ErrorView in cls.__mro__)
+ cls is not RouteView and
+ BaseView in cls.__mro__
):
cls.setup(self.app)
print(f"View loaded: {cls.name: <25} ({module.__name__}.{cls_name})")
+
+ def setup_db(self):
+ connection = self.get_db_connection(connect_database=False)
+
+ try:
+ rethinkdb.db_create(DB_DATABASE).run(connection)
+ rethinkdb.db(DB_DATABASE).table_create(DB_TABLE).run(connection)
+ print("Database created")
+ except rethinkdb.RqlRuntimeError:
+ print("Database found")
+ finally:
+ connection.close()
+
+ self.app.before_request(self.db_before_request)
+ self.app.teardown_request(self.db_teardown_request)
+
+ def get_db_connection(self, connect_database=True):
+ if connect_database:
+ return rethinkdb.connect(host=DB_HOST, port=DB_PORT, db=DB_DATABASE)
+ else:
+ return rethinkdb.connect(host=DB_HOST, port=DB_PORT)
+
+ def db_before_request(self):
+ try:
+ # g is the Flask global context object
+ g.rdb_conn = self.get_db_connection()
+ except rethinkdb.RqlDriverError:
+ abort(503, "Database connection could be established.")
+
+ def db_teardown_request(self, _):
+ try:
+ # g is the Flask global context object
+ g.rdb_conn.close()
+ except AttributeError:
+ pass
diff --git a/pysite/views/healthcheck.py b/pysite/views/healthcheck.py
index 3931100c..088bc7b3 100644
--- a/pysite/views/healthcheck.py
+++ b/pysite/views/healthcheck.py
@@ -1,10 +1,13 @@
# coding=utf-8
from flask import jsonify
-from pysite.base_route import BaseView
+from pysite.base_route import RouteView
-class IndexView(BaseView):
+__author__ = "Gareth Coles"
+
+
+class IndexView(RouteView):
path = "/healthcheck"
name = "healthcheck"
diff --git a/pysite/views/index.py b/pysite/views/index.py
index 48a98fac..0c2d1578 100644
--- a/pysite/views/index.py
+++ b/pysite/views/index.py
@@ -1,10 +1,10 @@
# coding=utf-8
-from pysite.base_route import BaseView
+from pysite.base_route import RouteView
-class IndexView(BaseView):
+class IndexView(RouteView):
path = "/"
name = "index"
def get(self):
- return "Coming soon:tm:"
+ return self.render("index.html")
diff --git a/pysite/views/invite.py b/pysite/views/invite.py
index 65cd75a5..07ddc830 100644
--- a/pysite/views/invite.py
+++ b/pysite/views/invite.py
@@ -1,10 +1,13 @@
# coding=utf-8
from flask import redirect
-from pysite.base_route import BaseView
+from pysite.base_route import RouteView
-class InviteView(BaseView):
+__author__ = "Gareth Coles"
+
+
+class InviteView(RouteView):
path = "/invite"
name = "invite"