summaryrefslogtreecommitdiff
path: root/day9/task5_vue/backend/router.py
diff options
context:
space:
mode:
authorAndrew <saintruler@gmail.com>2019-07-18 23:12:10 +0400
committerAndrew <saintruler@gmail.com>2019-07-18 23:12:10 +0400
commit70c3b1e1c5e1bbc354fe5961bae613bd23c4d8a2 (patch)
treee13b70feca0d8cdb10ced6fac91456990ae3f661 /day9/task5_vue/backend/router.py
parent473318701040f238fcbef81a404b069b68d64237 (diff)
Переписал приложение на Vue. Изменена верстка.
Diffstat (limited to 'day9/task5_vue/backend/router.py')
-rw-r--r--day9/task5_vue/backend/router.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/day9/task5_vue/backend/router.py b/day9/task5_vue/backend/router.py
new file mode 100644
index 0000000..be8305e
--- /dev/null
+++ b/day9/task5_vue/backend/router.py
@@ -0,0 +1,41 @@
+import re
+from backend.utils import NOT_FOUND_CODE, BAD_REQUEST_CODE
+from backend.core import Response, ErrorResponse
+
+
+def route(url_format, methods=None):
+ if methods is None:
+ methods = ['GET']
+
+ def wrapper(func):
+ def inner(url, query, *args, **kwargs):
+ pattern = re.compile(url_format)
+ match = re.fullmatch(pattern, url)
+
+ if match is None or len(match.groups()) != pattern.groups:
+ return ErrorResponse(BAD_REQUEST_CODE)
+
+ return func(query, *match.groups(), *args, **kwargs)
+
+ _router_tree[url_format] = _router_tree.get(url_format, {})
+ for method in methods:
+ _router_tree[url_format][method] = inner
+
+ return inner
+
+ return wrapper
+
+
+def run(request) -> Response:
+ res = ErrorResponse(NOT_FOUND_CODE)
+
+ method, url = request['method'], request['url']
+ for url_pattern in _router_tree:
+ if re.fullmatch(url_pattern, url) and method in _router_tree[url_pattern]:
+ res = _router_tree[url_pattern][method](url, request['query'])
+ break
+
+ return res
+
+
+_router_tree = {}