diff options
| author | Andrew <saintruler@gmail.com> | 2019-05-25 18:12:29 +0400 |
|---|---|---|
| committer | Andrew <saintruler@gmail.com> | 2019-05-25 18:12:29 +0400 |
| commit | 7f8d38bcbde018590cccf532f1d96bd6c2d62e44 (patch) | |
| tree | 792d938f31242695fa6dbfda3a1bb09b093e19b2 /day7/backend.py | |
| parent | 15690f0f1ae23c9956046187d6deb24cdfd19931 (diff) | |
Изменен формат параметров некоторых функций.
Расширены функции логирования.
Изменен декодировщик url.
Diffstat (limited to 'day7/backend.py')
| -rw-r--r-- | day7/backend.py | 62 |
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']: |