import bottle import hashlib import base64 import MySQLdb import urlparse import bottle_mysql from bottle import request app = bottle.default_app() app.config.load_config('shortener.cfg') bottle.install(bottle_mysql.Plugin( dbuser=app.config['database.user'], dbpass=app.config['database.password'], dbname=app.config['database.name'])) @bottle.route('/new') def new_url(db): url = request.query.url token = base64.b64encode(hashlib.sha1(url).digest(), ['0', '1'])[:8] try: db.execute('INSERT INTO urls VALUES (%s, %s)', (token, url)) except MySQLdb.IntegrityError: pass url = urlparse.urlunparse((request.urlparts[0], request.urlparts[1], token, '', '', '')) return url @bottle.route('/all') def remote(db): db.execute('SELECT u.*, COUNT(s.token) AS hits FROM urls u LEFT JOIN url_access s ON s.token = u.token GROUP BY u.token') return dict( (i['token'], { 'url': i['url'], 'hits': i['hits'] }) for i in db.fetchall()) @bottle.route('/') def visit_url(db, token): db.execute('SELECT * FROM urls WHERE token = %s', (token,)) result = db.fetchone() if not result: bottle.abort(404, 'Not Found') else: db.execute('INSERT INTO url_access(token, ip) VALUES (%s, %s)', (result['token'], request.remote_addr)) bottle.redirect(result['url'])