summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Crute <mcrute@gmail.com>2015-07-29 18:30:14 -0700
committerMike Crute <mcrute@gmail.com>2015-07-29 18:30:14 -0700
commit7b9d05c19365dc2ebb844b643da3542fc5e031c1 (patch)
treeb28c68ee581ae3b6252310ac69d0a973c307fb77
downloadurl_shortener-7b9d05c19365dc2ebb844b643da3542fc5e031c1.tar.bz2
url_shortener-7b9d05c19365dc2ebb844b643da3542fc5e031c1.tar.xz
url_shortener-7b9d05c19365dc2ebb844b643da3542fc5e031c1.zip
Initial importHEADmaster
-rw-r--r--shortener.py52
1 files changed, 52 insertions, 0 deletions
diff --git a/shortener.py b/shortener.py
new file mode 100644
index 0000000..7709a28
--- /dev/null
+++ b/shortener.py
@@ -0,0 +1,52 @@
1import bottle
2import hashlib
3import base64
4import MySQLdb
5import urlparse
6import bottle_mysql
7from bottle import request
8
9
10app = bottle.default_app()
11app.config.load_config('shortener.cfg')
12
13bottle.install(bottle_mysql.Plugin(
14 dbuser=app.config['database.user'],
15 dbpass=app.config['database.password'],
16 dbname=app.config['database.name']))
17
18
19@bottle.route('/new')
20def new_url(db):
21 url = request.query.url
22 token = base64.b64encode(hashlib.sha1(url).digest(), ['0', '1'])[:8]
23
24 try:
25 db.execute('INSERT INTO urls VALUES (%s, %s)', (token, url))
26 except MySQLdb.IntegrityError:
27 pass
28
29 url = urlparse.urlunparse((request.urlparts[0], request.urlparts[1], token, '', '', ''))
30
31 return url
32
33
34@bottle.route('/all')
35def remote(db):
36 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')
37 return dict(
38 (i['token'], { 'url': i['url'], 'hits': i['hits'] })
39 for i in db.fetchall())
40
41
42@bottle.route('/<token>')
43def visit_url(db, token):
44 db.execute('SELECT * FROM urls WHERE token = %s', (token,))
45 result = db.fetchone()
46
47 if not result:
48 bottle.abort(404, 'Not Found')
49 else:
50 db.execute('INSERT INTO url_access(token, ip) VALUES (%s, %s)',
51 (result['token'], request.remote_addr))
52 bottle.redirect(result['url'])