diff options
author | Mike Crute <mcrute@gmail.com> | 2015-07-29 18:30:14 -0700 |
---|---|---|
committer | Mike Crute <mcrute@gmail.com> | 2015-07-29 18:30:14 -0700 |
commit | 7b9d05c19365dc2ebb844b643da3542fc5e031c1 (patch) | |
tree | b28c68ee581ae3b6252310ac69d0a973c307fb77 | |
download | url_shortener-master.tar.bz2 url_shortener-master.tar.xz url_shortener-master.zip |
-rw-r--r-- | shortener.py | 52 |
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 @@ | |||
1 | import bottle | ||
2 | import hashlib | ||
3 | import base64 | ||
4 | import MySQLdb | ||
5 | import urlparse | ||
6 | import bottle_mysql | ||
7 | from bottle import request | ||
8 | |||
9 | |||
10 | app = bottle.default_app() | ||
11 | app.config.load_config('shortener.cfg') | ||
12 | |||
13 | bottle.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') | ||
20 | def 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') | ||
35 | def 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>') | ||
43 | def 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']) | ||