-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
68 lines (54 loc) · 2.38 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
import json
from http.server import BaseHTTPRequestHandler, HTTPServer
from validator import validator
from logic import RecFinder
from errors import ErrorItemNotFound
FILE = "recommends.csv"
PORT = 8080
finder = RecFinder(FILE)
class Server(BaseHTTPRequestHandler):
def _set_headers(self):
self.send_response(200)
self.send_header('Content-type', 'application/json')
self.end_headers()
def do_HEAD(self):
self._set_headers()
def do_POST(self):
"""Метод, отправляющий сообщение с JSON"""
length = int(self.headers.get('content-length'))
try:
message = json.loads(self.rfile.read(length))
except json.decoder.JSONDecodeError:
message = json.dumps({'status': False, 'error': 'Bad request'}).encode('utf-8')
self.response_to_client(code=400, message=message)
err = validator(data=message)
if err:
message = json.dumps({'status': False, 'error': err}).encode('utf-8')
self.response_to_client(code=400, message=message)
try:
self.response_to_client(code=200, message=self.message_handler(message))
except ErrorItemNotFound:
message = json.dumps({'status': False, 'error': "Bad request"}).encode('utf-8')
self.response_to_client(code=400, message=message)
def response_to_client(self, code, message):
"""Отправка сообщения клиенту"""
self._set_headers()
self.send_response_only(code=code, message=message)
self.end_headers()
return None
def message_handler(self, message):
"""Обработка сообщения от клиента и выдача списка"""
# finder = RecFinder(FILE)
if message.get("prob_threshold"):
result = finder.find_recommendations(message["recommend_item"], message["prob_threshold"])
return {"status": True,"target_list": result}
else:
result = finder.find_recommendations(message["recommend_item"])
return {"status": True,"target_list": result}
def run(server_class=HTTPServer, handler_class=Server, port=PORT):
server_address = ('', port)
httpd = server_class(server_address, handler_class)
print('Starting httpd on port %d...' % port)
httpd.serve_forever()
if __name__ == "__main__":
run()