template: merge context and globals before context function, http_server: start adding fediverse views
This commit is contained in:
parent
cd20eaea97
commit
5efee0ffd2
|
@ -10,6 +10,10 @@ You only need to install the base and whatever sub-modules you want to use
|
||||||
|
|
||||||
$(venv)/bin/python -m pip install -e "git+https://git.barkshark.xyz/izaliamae/izzylib.git@rework#egg=izzylib-base&subdirectory=base"
|
$(venv)/bin/python -m pip install -e "git+https://git.barkshark.xyz/izaliamae/izzylib.git@rework#egg=izzylib-base&subdirectory=base"
|
||||||
|
|
||||||
|
$(venv)/bin/python -m pip install -e "git+https://git.barkshark.xyz/izaliamae/izzylib.git@rework#egg=izzylib-dbus&subdirectory=dbus"
|
||||||
|
|
||||||
|
$(venv)/bin/python -m pip install -e "git+https://git.barkshark.xyz/izaliamae/izzylib.git@rework#egg=izzylib-hasher&subdirectory=hasher"
|
||||||
|
|
||||||
$(venv)/bin/python -m pip install -e "git+https://git.barkshark.xyz/izaliamae/izzylib.git@rework#egg=izzylib-http-server&subdirectory=http_server"
|
$(venv)/bin/python -m pip install -e "git+https://git.barkshark.xyz/izaliamae/izzylib.git@rework#egg=izzylib-http-server&subdirectory=http_server"
|
||||||
|
|
||||||
$(venv)/bin/python -m pip install -e "git+https://git.barkshark.xyz/izaliamae/izzylib.git@rework#egg=izzylib-http-requests-client&subdirectory=requests_client"
|
$(venv)/bin/python -m pip install -e "git+https://git.barkshark.xyz/izaliamae/izzylib.git@rework#egg=izzylib-http-requests-client&subdirectory=requests_client"
|
||||||
|
@ -22,7 +26,7 @@ You only need to install the base and whatever sub-modules you want to use
|
||||||
|
|
||||||
### From Source
|
### From Source
|
||||||
|
|
||||||
$(venv)/bin/python setup.py install ['all' or a combination of these: http_server requests_client sql template tinydb]
|
$(venv)/bin/python setup.py install ['all' or a combination of these: dbus hasher http_server requests_client sql template tinydb]
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ log_ext_ignore = [
|
||||||
frontend = Path(__file__).resolve.parent.join('frontend')
|
frontend = Path(__file__).resolve.parent.join('frontend')
|
||||||
|
|
||||||
class Application(sanic.Sanic):
|
class Application(sanic.Sanic):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, class_views=[], **kwargs):
|
||||||
self.cfg = Config(**kwargs)
|
self.cfg = Config(**kwargs)
|
||||||
|
|
||||||
super().__init__(self.cfg.name, request_class=self.cfg.request_class)
|
super().__init__(self.cfg.name, request_class=self.cfg.request_class)
|
||||||
|
@ -45,6 +45,7 @@ class Application(sanic.Sanic):
|
||||||
self.cfg.tpl_autoescape
|
self.cfg.tpl_autoescape
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.template.add_env('app', self)
|
||||||
self.template.add_env('cfg', self.cfg)
|
self.template.add_env('cfg', self.cfg)
|
||||||
self.template.add_env('len', len)
|
self.template.add_env('len', len)
|
||||||
|
|
||||||
|
@ -56,6 +57,9 @@ class Application(sanic.Sanic):
|
||||||
self.static('/favicon.ico', frontend.join('static/icon64.png'))
|
self.static('/favicon.ico', frontend.join('static/icon64.png'))
|
||||||
self.static('/framework/static', frontend.join('static'))
|
self.static('/framework/static', frontend.join('static'))
|
||||||
|
|
||||||
|
for view in class_views:
|
||||||
|
self.add_class_route(view)
|
||||||
|
|
||||||
self.add_error_handler(MissingTemplateError)
|
self.add_error_handler(MissingTemplateError)
|
||||||
self.add_error_handler(GenericError)
|
self.add_error_handler(GenericError)
|
||||||
|
|
||||||
|
@ -64,6 +68,9 @@ class Application(sanic.Sanic):
|
||||||
signal.signal(signal.SIGQUIT, self.finish)
|
signal.signal(signal.SIGQUIT, self.finish)
|
||||||
signal.signal(signal.SIGTERM, self.finish)
|
signal.signal(signal.SIGTERM, self.finish)
|
||||||
|
|
||||||
|
## compat
|
||||||
|
self.start = self.run
|
||||||
|
|
||||||
|
|
||||||
def add_class_route(self, cls):
|
def add_class_route(self, cls):
|
||||||
for route in cls.paths:
|
for route in cls.paths:
|
||||||
|
@ -100,10 +107,12 @@ class Application(sanic.Sanic):
|
||||||
return handler
|
return handler
|
||||||
|
|
||||||
|
|
||||||
def start(self):
|
def run(self):
|
||||||
# register built-in middleware now so they're last in the chain
|
# register built-in middleware now so they're last in the chain
|
||||||
self.add_middleware(Headers)
|
self.add_middleware(Headers)
|
||||||
self.add_middleware(AccessLog)
|
|
||||||
|
if self.cfg.access_log:
|
||||||
|
self.add_middleware(AccessLog)
|
||||||
|
|
||||||
msg = f'Starting {self.cfg.name} at {self.cfg.host}:{self.cfg.port}'
|
msg = f'Starting {self.cfg.name} at {self.cfg.host}:{self.cfg.port}'
|
||||||
|
|
||||||
|
@ -111,7 +120,7 @@ class Application(sanic.Sanic):
|
||||||
msg += f' with {self.cfg.workers} workers'
|
msg += f' with {self.cfg.workers} workers'
|
||||||
|
|
||||||
logging.info(msg)
|
logging.info(msg)
|
||||||
self.run(
|
super().run(
|
||||||
host = self.cfg.listen,
|
host = self.cfg.listen,
|
||||||
port = self.cfg.port,
|
port = self.cfg.port,
|
||||||
workers = self.cfg.workers,
|
workers = self.cfg.workers,
|
||||||
|
|
|
@ -17,6 +17,8 @@ class View(HTTPMethodView):
|
||||||
return handler(request, Response(self.app, request), *args, **kwargs)
|
return handler(request, Response(self.app, request), *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
### Frontend Template Views ###
|
||||||
|
|
||||||
class Manifest(View):
|
class Manifest(View):
|
||||||
paths = ['/framework/manifest.json']
|
paths = ['/framework/manifest.json']
|
||||||
|
|
||||||
|
@ -62,3 +64,49 @@ class Style(View):
|
||||||
async def get(self, request, response):
|
async def get(self, request, response):
|
||||||
return response.template('base.css', content_type='text/css')
|
return response.template('base.css', content_type='text/css')
|
||||||
|
|
||||||
|
|
||||||
|
### ActivityPub Views ###
|
||||||
|
|
||||||
|
class Actor(View):
|
||||||
|
paths = ['/actor', '/actor/<actor>', '/inbox']
|
||||||
|
|
||||||
|
def get(self, request, response, actor=None):
|
||||||
|
if not actor:
|
||||||
|
actor = 'system'
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def post(self, request, response, actor=None):
|
||||||
|
if not actor:
|
||||||
|
actor = 'system'
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Nodeinfo(View):
|
||||||
|
paths = ['/nodeinfo/2.0.json']
|
||||||
|
|
||||||
|
def get(self, request, response):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class Webfinger(View):
|
||||||
|
paths = ['/.well-known/webfinger']
|
||||||
|
|
||||||
|
def get(self, request, response):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WkHostMeta(View):
|
||||||
|
paths = ['/.well-known/host-meta']
|
||||||
|
|
||||||
|
def get(self, request, response):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WkNodeinfo(View):
|
||||||
|
paths = ['/.well-known/nodeinfo']
|
||||||
|
|
||||||
|
def get(self, request, response):
|
||||||
|
pass
|
||||||
|
|
|
@ -69,7 +69,7 @@ class Template(Environment):
|
||||||
izzylog.error('Context is not callable')
|
izzylog.error('Context is not callable')
|
||||||
return
|
return
|
||||||
|
|
||||||
if not isinstance(context({}, {}), dict):
|
if not isinstance(context({}), dict):
|
||||||
izzylog.error('Context does not return a dict or dict-like object')
|
izzylog.error('Context does not return a dict or dict-like object')
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -113,14 +113,21 @@ class Template(Environment):
|
||||||
self.filters.update(data)
|
self.filters.update(data)
|
||||||
|
|
||||||
|
|
||||||
def render(self, tplfile, context={}, headers={}, cookies={}, request=None, pprint=False):
|
def render(self, tplfile, context_data={}, headers={}, cookies={}, request=None, pprint=False):
|
||||||
if not isinstance(context, dict):
|
if not isinstance(context_data, dict):
|
||||||
raise TypeError(f'context for {tplfile} not a dict: {type(context)} {context}')
|
raise TypeError(f'context for {tplfile} not a dict: {type(context)} {context}')
|
||||||
|
|
||||||
|
context = DotDict(self.globals)
|
||||||
|
context.update(context_data)
|
||||||
context['request'] = request if request else {'headers': headers, 'cookies': cookies}
|
context['request'] = request if request else {'headers': headers, 'cookies': cookies}
|
||||||
|
|
||||||
if self.func_context:
|
if self.func_context:
|
||||||
context.update(self.func_context(DotDict(context), DotDict(self.globals)))
|
# Backwards compat
|
||||||
|
try:
|
||||||
|
context = self.func_context(context)
|
||||||
|
|
||||||
|
except TypeError:
|
||||||
|
context = self.func_context(context, {})
|
||||||
|
|
||||||
result = self.get_template(tplfile).render(context)
|
result = self.get_template(tplfile).render(context)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue