activitypub/activitypub/manager/tornadoman.py

87 wiersze
2.6 KiB
Python

try:
import tornado
from tornado.web import (Application, RequestHandler)
except:
pass # tornado not available
import inspect
import jinja2
from .base import Manager, wrap_function, app
def make_handler(f, manager):
"""
Make a Tornado Handler
"""
class Handler(RequestHandler):
def get(self):
return f(self)
def render_template(self, name, **kwargs):
self.write(manager.render_template(name, **kwargs))
## redirect is here
return Handler
class TornadoManager(Manager):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._filters = None
self.template_env = jinja2.Environment(
loader=jinja2.FileSystemLoader(self.get_template_folder()))
def get_filters(self):
if self._filters is None:
self._filters = {f.__name__: wrap_function(self, f)
for f in app._data.filters}
return self._filters
def render_template(self, name, **kwargs):
filters = self.get_filters()
config = {}
config["ME"] = {"url": "https://example.com",
"icon": {"url": "https://example.com"},
"icon_url": 'https://cs.brynmawr.edu/~dblank/images/doug-sm-orig.jpg',
"summary": "I'm just me."}
config["CSS"] = self.CSS
config["NAME"] = "ActivityPub Blog"
config["ID"] = "http://localhost:5000"
request = {"args": {}}
session = {"logged_in": True}
tornado.log.logging.warning("%s" % filters.keys())
self.template_env.filters.update(filters)
template = self.template_env.get_template(name)
return template.render(config=config,
request=request,
session=session,
**kwargs)
## TODO: move to app.Data
#def login_required():
# tornado.web.authenticated
#def render_template(self, template_name, **kwargs):
# return render_template(template_name, **kwargs)
#def redirect(self, url):
# return redirect(url)
def url_for(self, name):
return url_for(name)
@property
def request(self):
return request
def run(self):
routes = []
for route, methods, f in app._data.routes:
params = [x.name for x in inspect.signature(f).parameters.values()]
routes.append((route, make_handler(f, self)))
self.app = Application(routes)
self.app.listen(5000)
tornado.ioloop.IOLoop.current().start()