-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
executable file
·122 lines (102 loc) · 3.53 KB
/
server.py
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
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python
import json, logging
import functools
from asyncmc import Client
from session import MemcacheStore, Session
import tornado.auth
import tornado.escape
import tornado.httpserver
import tornado.ioloop
import tornado.web
import threading
from tornado import gen, autoreload
from tornado.options import define, options, parse_command_line
import forms
import pixiv_api
define("port", default=8000, help="run on the given port", type=int)
class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"/server/auth/login", AuthHandler),
(r"/server/auth/logout", LogoutHandler),
(r"/server/", MainPage),
]
settings = dict(
cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__",
login_url="/",
)
self.session_store = MemcacheStore(Client(servers=['memcached:11211']))
tornado.web.Application.__init__(self, handlers, **settings)
class BaseHandler(tornado.web.RequestHandler):
@gen.coroutine
def get_current_user(self):
yield self.set_session()
return self.session.get('user', {})
@gen.coroutine
def set_session(self):
sessionid = self.get_secure_cookie('auth_id')
if sessionid:
sessionid = sessionid.decode('utf-8')
self.session = yield Session.make(self.application.session_store, sessionid)
if not sessionid:
self.set_secure_cookie("auth_id", self.session.get_session_id())
return self.session
class MainPage(BaseHandler):
@gen.coroutine
@tornado.web.authenticated
def get(self):
user_info = yield self.current_user
info = {
'info_list': [],
}
if 'pixiv_session_id' in user_info:
conn = pixiv_api.Connector(id=user_info['pixiv_session_id'])
login_err = yield conn.get_login_fut()
if not login_err:
info['info_list'] = yield conn.get_ranking()
self.write(info)
class AuthHandler(BaseHandler):
@gen.coroutine
def get(self):
user_info = yield self.current_user
if 'pixiv_session_id' in user_info:
conn = pixiv_api.Connector(id=user_info['pixiv_api'])
auth_info = yield conn.login_fut()
if not auth_info:
out = {'status': 'unauth'}
else:
out = {'status': 'ok'}
else:
out = {'status': 'unauth'}
self.write(out)
@gen.coroutine
def post(self):
user_info = yield self.current_user
data = json.loads(self.request.body.decode('utf8'))
form = forms.LoginForm(forms.TornadoMultiDict(data))
if form.validate():
conn = pixiv_api.Connector()
login_err = yield conn.get_login_fut(**form.data)
if login_err:
self.set_status(401)
self.write(login_err)
else:
user_info['con_obj'] = conn.id
self.write(form.data)
else:
self.set_status(401)
self.write(form.errors)
class LogoutHandler(BaseHandler):
def get(self):
self.clear_cookie("auth_id")
self.write('You are now logged out. '
'Click <a href="/">here</a> to log back in.')
def main():
parse_command_line()
http_server = tornado.httpserver.HTTPServer(Application())
http_server.listen(options.port)
ioloop = tornado.ioloop.IOLoop().instance()
autoreload.start(ioloop)
ioloop.start()
if __name__ == "__main__":
main()