1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
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('/<token>')
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'])
|