3 # FLASK_APP=restpublish.py flask run
8 from flask_restful
import Resource
, Api
12 def __init__(self
, key
, value
):
16 def update(self
, value
):
18 self
.ctime
= datetime
.datetime
.now()
20 def is_expired(self
, maxage
):
21 return datetime
.datetime
.now() - self
.ctime
>= maxage
26 self
.key_dict
= dict()
27 self
.chronolist
= list()
29 def insert(self
, key
, value
):
30 if key
in self
.key_dict
:
31 el
= self
.key_dict
[key
]
34 el
= Element(key
, value
)
35 self
.key_dict
[key
] = el
36 self
.chronolist
.append(el
)
39 def remove(self
, key
):
40 del self
.key_dict
[key
]
41 self
.chronolist
= [el
for el
in self
.chronolist
if el
.key
!= key
]
43 def garbagecollect(self
):
44 maxage
= datetime
.timedelta(7)
45 oldestctime
= datetime
.datetime
.now() - maxage
47 return el
.ctime
< oldestctime
49 # Get idx such that self.chronolist[:idx] is expired and
50 # self.chronolist[idx:] is not expired.
52 while idx
< len(self
.chronolist
) - 1:
53 if not is_expired(self
.chronolist
[idx
]):
57 for el
in self
.chronolist
[:idx
]:
58 del self
.key_dict
[el
.key
]
60 self
.chronolist
= self
.chronolist
[idx
:]
63 class EntryPoint(Resource
):
65 return { 'elements': [el
.key
for el
in store
.chronolist
] }
67 class ElementPoint(Resource
):
69 if key
not in store
.key_dict
:
70 return { 'message': 'No such element'}, 404
72 el
= store
.key_dict
[key
]
73 return { 'key': key
, 'value': el
.value
, 'ctime': str(el
.ctime
) }
75 def delete(self
, key
):
76 if key
in store
.key_dict
:
78 return { 'message': 'ok'}
81 req
= flask
.request
.get_json(force
=True)
83 if 'value' not in req
:
84 return {'message': 'No value given.'}, 403
86 el
= store
.insert(key
, req
['value'])
87 store
.garbagecollect()
88 return { 'key': key
, 'value': el
.value
, 'ctime': str(el
.ctime
) }
91 # Map of keys to values
92 store
= ElementStore()
94 app
= flask
.Flask(__name__
)
96 api
.add_resource(EntryPoint
, "/")
97 api
.add_resource(ElementPoint
, "/<key>")