-
Notifications
You must be signed in to change notification settings - Fork 2
/
utils.py
102 lines (70 loc) · 3.7 KB
/
utils.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
""" Классы и функции для middlewares.
"""
import json
from dataclasses import dataclass
from datetime import datetime
from typing import Any, Callable, Dict, Optional
from uuid import UUID
from aiohttp import web
# json -----------------------------------------------------------------------
class ServiceJSONEncoder(json.JSONEncoder):
""" Кодирование данных сервиса в json.
(пример подключения обработки UUID и datetime)
"""
def default(self, obj):
if isinstance(obj, UUID):
return str(obj)
elif isinstance(obj, datetime):
return int(obj.timestamp())
return json.JSONEncoder.default(self, obj)
def json_dumps(obj) -> str:
""" Кодирования данных сервиса в json.
"""
return json.dumps(obj, cls=ServiceJSONEncoder)
# ArgumentsManager -----------------------------------------------------------
@dataclass
class RawDataForArgument:
request: web.Request
request_body: Any
arg_name: Optional[str] = None
class ArgumentsManager:
""" Менеджер для аргументов обработчика.
Связывает имя аргумента с действием, которое надо совершить для
получения значения аргумента.
TODO: Сейчас менеджер очень простой.
Можно добавить регистрацию сразу нескольких ключей одного вида.
А так же, добавить правила для разрешений конфликтов имен.
И проч... например, и то, что потом можно будет использовать при
сборке документации.
"""
def __init__(self) -> None:
self.getters: Dict[str, Callable] = {}
# Тело json запроса ------------------------------------------------------
def reg_request_body(self, arg_name) -> None:
""" Регистрация имени аргумента для тела запроса.
"""
self.getters[arg_name] = self.get_request_body
def get_request_body(self, raw_data: RawDataForArgument):
return raw_data.request_body
# Ключи в request --------------------------------------------------------
def reg_request_key(self, arg_name) -> None:
""" Регистрация имени аргумента который хранится в request.
"""
self.getters[arg_name] = self.get_request_key
def get_request_key(self, raw_data: RawDataForArgument):
return raw_data.request[raw_data.arg_name]
# Ключи в request.app ----------------------------------------------------
def reg_app_key(self, arg_name) -> None:
""" Регистрация имени аргумента который хранится в app.
"""
self.getters[arg_name] = self.get_app_key
def get_app_key(self, raw_data: RawDataForArgument):
return raw_data.request.app[raw_data.arg_name]
# Параметры запроса ------------------------------------------------------
def reg_match_info_key(self, arg_name) -> None:
""" Регистрация имени аргумента который приходит в параметрах запроса.
"""
self.getters[arg_name] = self.get_match_info_key
def get_match_info_key(self, raw_data: RawDataForArgument):
return raw_data.request.match_info[raw_data.arg_name]
# Можно добавить и другие регистраторы...