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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
import json
from flask import Flask, request
from flask.ext import restful
from flask.ext.cache import Cache
from flask.ext.restful import reqparse
from flask.ext.sqlalchemy import SQLAlchemy
from os import environ
from cors import crossdomain
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = environ.get('DATABASE_URL', 'postgres://localhost:5432/traces')
cache = Cache(app, config={
'CACHE_TYPE': 'redis',
'CACHE_REDIS_URL': environ.get('REDISCLOUD_URL', 'redis://localhost')
})
db = SQLAlchemy(app)
api = restful.Api(app)
trace_parser = reqparse.RequestParser()
trace_parser.add_argument('page', type=str)
trace_parser.add_argument('trace', type=str)
class Trace(db.Model):
id = db.Column(db.Integer, primary_key=True)
page = db.Column(db.String(100))
trace = db.Column(db.Text())
def __init__(self, page, trace):
self.page = page
self.trace = trace
def __repr__(self):
return '{} {}'.format(self.id, self.page)
@cache.memoize(timeout=60*2)
def _get_page_traces(page=None, limit=3):
print 'hit'
traces = Trace.query
if page:
traces = traces.filter_by(page=page)
traces = traces.order_by(Trace.id.desc()).limit(limit)
return json.dumps([{
'page': trace.page,
'trace': json.loads(trace.trace)
} for trace in traces])
class Traces(restful.Resource):
@crossdomain(origin='*')
def get(self):
args = trace_parser.parse_args()
page = request.args.get('page')
limit = int(request.args.get('limit', '3'))
return _get_page_traces(page, limit)
@crossdomain(origin='*')
def post(self):
args = trace_parser.parse_args()
trace = Trace(args['page'], args['trace'])
db.session.add(trace)
db.session.commit()
return 'ok', 201
api.add_resource(Traces, '/traces')
if __name__ == '__main__':
app.run(debug=True)
|