forked from Nazarii/todotxt_web
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.py
More file actions
executable file
·109 lines (82 loc) · 2.77 KB
/
server.py
File metadata and controls
executable file
·109 lines (82 loc) · 2.77 KB
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from tornado.ioloop import IOLoop
from tornado.web import Application, url, RequestHandler
from tornado.options import define, options
from tornado.escape import json_encode, json_decode
from concurrent.futures import ThreadPoolExecutor
from functools import wraps
MAX_WORKERS = 4
import todo_txt
define("port", default="8880", help="Worker port number")
define("config", help="Config file name", default="default_config.py")
define("todo_file", help="todo.txt file path")
def method_proxy(f):
@wraps(f)
def wrapper(obj, *args, **kwargs):
if 'method' in kwargs:
method = kwargs.pop('method')
else:
method = None
if method:
return getattr(obj, method)(*args, **kwargs)
else:
return f(obj, *args, **kwargs)
return wrapper
class RequestHandlerProxy(RequestHandler):
executor = ThreadPoolExecutor(max_workers=MAX_WORKERS)
@method_proxy
def get(self, *args, **kwargs):
return super(RequestHandlerProxy, self).get(*args, **kwargs)
@method_proxy
def post(self, *args, **kwargs):
return super(RequestHandlerProxy, self).post(*args, **kwargs)
@method_proxy
def delete(self, *args, **kwargs):
return super(RequestHandlerProxy, self).delete(*args, **kwargs)
@method_proxy
def put(self, *args, **kwargs):
return super(RequestHandlerProxy, self).put(*args, **kwargs)
@method_proxy
def head(self, *args, **kwargs):
return super(RequestHandlerProxy, self).head(*args, **kwargs)
@method_proxy
def options(self, *args, **kwargs):
return super(RequestHandlerProxy, self).options(*args, **kwargs)
class MainHandler(RequestHandler):
def get(self):
self.render('main.html')
class TodoHandler(RequestHandler):
def initialize(self):
self.todo = todo_txt.TodoTxt(options.todo_file)
def get(self):
result_encoded = json_encode(self.todo.serialize())
self.write(result_encoded)
def post(self):
todo_list = json_decode(self.request.body)
print todo_list
self.todo.unserialize(todo_list)
self.write('saved')
def make_app():
return Application(
[
url(r"/", MainHandler),
url(r"/todo/", TodoHandler),
],
template_path=os.path.join('static', 'html'),
static_path=os.path.join('static'),
debug=True,
)
def start_app(app):
app.listen(options.port)
IOLoop.current().start()
def main():
options.parse_command_line()
if options.config:
options.parse_config_file(options.config)
app = make_app()
start_app(app)
if __name__ == '__main__':
main()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: