|
|
|
@ -1,49 +1,40 @@
|
|
|
|
|
import os |
|
|
|
|
import logging |
|
|
|
|
import aiohttp_jinja2 |
|
|
|
|
import jinja2 |
|
|
|
|
|
|
|
|
|
import trafaret |
|
|
|
|
|
|
|
|
|
from aiohttp import web |
|
|
|
|
from pathlib import Path |
|
|
|
|
from flask import Flask |
|
|
|
|
from flask import render_template |
|
|
|
|
from flask import request |
|
|
|
|
from flask import redirect |
|
|
|
|
from flask import abort |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Web: |
|
|
|
|
def __init__(self, loop, handler): |
|
|
|
|
def __init__(self, handler, debug=False): |
|
|
|
|
self.logger = logging.getLogger(self.__class__.__name__) |
|
|
|
|
self.loop = loop |
|
|
|
|
self.app = None |
|
|
|
|
self.host = None |
|
|
|
|
self.port = None |
|
|
|
|
self.handler = handler |
|
|
|
|
self.router = None |
|
|
|
|
self.loader = None |
|
|
|
|
self.debug = debug |
|
|
|
|
|
|
|
|
|
def start_up(self): |
|
|
|
|
self.loop.run_until_complete(self.init()) |
|
|
|
|
web.run_app(self.app, host=self.host, port=self.port) |
|
|
|
|
self.init() |
|
|
|
|
self.app.run(host=self.host, port=self.port, debug=self.debug) |
|
|
|
|
|
|
|
|
|
async def init(self): |
|
|
|
|
self.app = web.Application(loop=self.loop) |
|
|
|
|
templates = Path(__file__).absolute().parent.parent.joinpath('templates') |
|
|
|
|
|
|
|
|
|
self.loader = jinja2.FileSystemLoader(str(templates)) |
|
|
|
|
self.logger.debug(str(templates)) |
|
|
|
|
aiohttp_jinja2.setup(self.app, |
|
|
|
|
loader=self.loader) |
|
|
|
|
def init(self): |
|
|
|
|
self.app = Flask(__name__) |
|
|
|
|
self.setup_routes() |
|
|
|
|
|
|
|
|
|
def setup_routes(self): |
|
|
|
|
self.router = self.app.router |
|
|
|
|
self.router.add_get('/', self.handler.index, |
|
|
|
|
name='index') |
|
|
|
|
self.router.add_post('/shortenit', self.handler.shortenit, |
|
|
|
|
name='shortenit') |
|
|
|
|
self.router.add_put('/pointers/favicon.ico', self.handler.favicon, |
|
|
|
|
name='favicon') |
|
|
|
|
self.router.add_get('/{identifier}', self.handler.redirect, |
|
|
|
|
name='redirect') |
|
|
|
|
self.app.add_url_rule('/', '/', self.handler.index, |
|
|
|
|
methods=['GET']) |
|
|
|
|
self.app.add_url_rule('/shortenit', '/shortenit', self.handler.shortenit, |
|
|
|
|
methods=['POST']) |
|
|
|
|
self.app.add_url_rule('/<identifier>', '/identifier', self.handler.short_redirect, |
|
|
|
|
methods=['GET']) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SiteHandler: |
|
|
|
@ -57,33 +48,31 @@ class SiteHandler:
|
|
|
|
|
trafaret.Key('timestamp'): trafaret.Int |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
async def shortenit(self, request): |
|
|
|
|
data = await request.json() |
|
|
|
|
self.logger.debug(data) |
|
|
|
|
def shortenit(self): |
|
|
|
|
data = request.get_json() |
|
|
|
|
try: |
|
|
|
|
data = self.shortenit_load_format(data) |
|
|
|
|
except Exception as e: |
|
|
|
|
self.logger.debug(e) |
|
|
|
|
raise web.HTTPBadRequest() |
|
|
|
|
self.logger.error(e) |
|
|
|
|
return {}, 400 |
|
|
|
|
self.logger.error(e) |
|
|
|
|
abort(400) |
|
|
|
|
try: |
|
|
|
|
short_url = self.shorten_url( |
|
|
|
|
self.database, data['url'], data['timestamp']) |
|
|
|
|
except KeyError as e: |
|
|
|
|
self.logger.debug(e) |
|
|
|
|
raise web.HTTPBadRequest() |
|
|
|
|
self.logger.error(e) |
|
|
|
|
abort(400) |
|
|
|
|
self.logger.debug(short_url) |
|
|
|
|
return web.json_response({"url": short_url}) |
|
|
|
|
return {"url": short_url} |
|
|
|
|
|
|
|
|
|
async def redirect(self, request): |
|
|
|
|
identifier = request.match_info['identifier'] |
|
|
|
|
def short_redirect(self, identifier): |
|
|
|
|
url = self.lenghten_url(self.database, identifier) |
|
|
|
|
self.logger.debug("The URL is...") |
|
|
|
|
self.logger.debug(url) |
|
|
|
|
if not url: |
|
|
|
|
raise web.HTTPNotFound() |
|
|
|
|
raise web.HTTPFound(location=url) |
|
|
|
|
|
|
|
|
|
async def favicon(self, request): |
|
|
|
|
raise web.Response(text={}) |
|
|
|
|
abort(404) |
|
|
|
|
return redirect(url) |
|
|
|
|
|
|
|
|
|
@aiohttp_jinja2.template('index.html') |
|
|
|
|
async def index(self, request): |
|
|
|
|
return {} |
|
|
|
|
def index(self): |
|
|
|
|
return render_template('index.html') |
|
|
|
|