summaryrefslogtreecommitdiff
path: root/day7/backend.py
diff options
context:
space:
mode:
Diffstat (limited to 'day7/backend.py')
-rw-r--r--day7/backend.py62
1 files changed, 52 insertions, 10 deletions
diff --git a/day7/backend.py b/day7/backend.py
index 99a62bd..e49bfe1 100644
--- a/day7/backend.py
+++ b/day7/backend.py
@@ -1,7 +1,7 @@
import re
from templater import render_template
-from utils import parse_cookies, add_headers, SUCCESS, BAD_REQUEST, NOT_FOUND, HTTP_METHODS
+from utils import parse_cookies, add_text_headers, SUCCESS, BAD_REQUEST, NOT_FOUND, HTTP_METHODS
from config import TEXT_TEMPLATE_NAME
import db
@@ -17,13 +17,17 @@ def route(url_format, methods=None):
def wrapper(func):
def inner(url, query, *args, **kwargs):
pattern = re.compile(url_format)
- match = re.match(pattern, url)
+ match = re.fullmatch(pattern, url)
if match is None or len(match.groups()) != pattern.groups:
return BAD_REQUEST, '400 BAD REQUEST'
return func(query, *match.groups(), *args, **kwargs)
+ # Добавляем вызываемую функцию в дерево роутера.
+ # Благодаря этому указывать паттерн url и метод нужно указывать
+ # только в инициализаторе декоратора, а функция run сама разберется
+ # при каких условиях нужно вызвать конкретную функцию
_router_tree[url_format] = _router_tree.get(url_format, {})
for method in methods:
_router_tree[url_format][method] = inner
@@ -33,18 +37,22 @@ def route(url_format, methods=None):
return wrapper
-def run(method, url: str, cookies: dict, query):
+def run(request):
res = NOT_FOUND, NOT_FOUND
- for key, value in cookies.items():
+
+ for key, value in request['cookies'].items():
db.set_cookie(key, value)
+ 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, query)
+ res = _router_tree[url_pattern][method](url, request['query'])
+ break
- return add_headers(*res)
+ return add_text_headers(*res)
+# По заданию любой метод, кроме GET и POST должны быть запрещены на сервере.
@route('/.*', list(set(HTTP_METHODS) ^ {'GET', 'POST'}))
def fallback_wrong_method(query, *args):
return NOT_FOUND, 'This method is not allowed'
@@ -55,10 +63,6 @@ def index_get(query, *args):
return SUCCESS, render_template('form', color=get_color())
-@route('/', ['POST'])
-def index_post(query, *args):
- return SUCCESS, str(query)
-
# Хотелось попробовать сделать что-то высокоуровневое с декораторами.
# Если в этом коде есть какие-то серьезные проблемы, то скажите сразу.
@route(r'/div/(\d+)/to/(\d+)/?')
@@ -178,6 +182,44 @@ def set_cookie_post(query, *args):
)
+@route(r'/short_log/(\d{1})/?')
+def short_log_get(query, *args):
+ color = get_color()
+
+ if args[0] == '1':
+ db.set_config_entry('short_log', 1)
+ return SUCCESS, render_template(TEXT_TEMPLATE_NAME, color=color, text='Опция short_log включена')
+
+ elif args[0] == '0':
+ db.set_config_entry('short_log', 0)
+ return SUCCESS, render_template(TEXT_TEMPLATE_NAME, color=color, text='Опция short_log выключена')
+
+ else:
+ return BAD_REQUEST, render_template(
+ TEXT_TEMPLATE_NAME, color=color,
+ text='Опция short_log не может принимать такое значение'
+ )
+
+
+@route(r'/short_log/?', ['POST'])
+def short_log_post(query, *args):
+ color = get_color()
+
+ if 'short_log' not in query:
+ db.set_config_entry('short_log', 0)
+ return SUCCESS, render_template(TEXT_TEMPLATE_NAME, color=color, text='Опция short_log выключена')
+
+ elif query['short_log'] == '1':
+ db.set_config_entry('short_log', 1)
+ return SUCCESS, render_template(TEXT_TEMPLATE_NAME, color=color, text='Опция short_log включена')
+
+ else:
+ return BAD_REQUEST, render_template(
+ TEXT_TEMPLATE_NAME, color=color,
+ text='Опция short_log не может принимать такое значение'
+ )
+
+
def get_color():
color = db.get_cookie('bg_color', 'white')
if color not in ['green', 'white']: