From d31296d87f86ca817b6d7c41c46bc83fe403a093 Mon Sep 17 00:00:00 2001 From: Andrew Date: Tue, 28 May 2019 21:58:51 +0400 Subject: =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20=D1=80=D0=BE=D1=83=D1=82?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=D0=B0.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- day7/backend.py | 100 +++++++++----------------------------------------------- 1 file changed, 15 insertions(+), 85 deletions(-) (limited to 'day7/backend.py') diff --git a/day7/backend.py b/day7/backend.py index 5fef9c3..0b63883 100644 --- a/day7/backend.py +++ b/day7/backend.py @@ -1,71 +1,18 @@ -import re - from templater import render_template -from utils import parse_cookies, add_text_headers, SUCCESS, BAD_REQUEST, NOT_FOUND, HTTP_METHODS, METHOD_NOT_ALLOWED +from utils import parse_cookies, SUCCESS, BAD_REQUEST, METHOD_NOT_ALLOWED from config import TEXT_TEMPLATE_NAME, FORM_TEMPLATE_NAME import db -_router_tree = {} - - -# url_format - регулярное выражение -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 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 - - return inner - - return wrapper - - -def run(request): - res = NOT_FOUND, NOT_FOUND - - 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, request['query']) - break - - return add_text_headers(*res) - - # По заданию любой метод, кроме GET и POST должны быть запрещены на сервере. -@route('/.*', list(set(HTTP_METHODS) ^ {'GET', 'POST'})) def fallback_wrong_method(query, *args): return METHOD_NOT_ALLOWED, 'This method is not allowed' -@route('/') def index_get(query, *args): return SUCCESS, render_template(FORM_TEMPLATE_NAME, color=get_color()) -# Хотелось попробовать сделать что-то высокоуровневое с декораторами. -# Если в этом коде есть какие-то серьезные проблемы, то скажите сразу. -@route(r'/div/(\d+)/to/(\d+)/?') def divide_get(query, *args): color = get_color() @@ -74,13 +21,9 @@ def divide_get(query, *args): return SUCCESS, render_template(TEXT_TEMPLATE_NAME, text=text, color=color) except ZeroDivisionError as e: - return BAD_REQUEST, render_template( - TEXT_TEMPLATE_NAME, color=color, - text=BAD_REQUEST + ('
' + str(e) if db.get_config_entry('show_errors') else '') - ) + return BAD_REQUEST, get_error_template(str(e), color) -@route(r'/div/?', ['POST']) def divide_post(query, *args): color = get_color() @@ -90,19 +33,12 @@ def divide_post(query, *args): except KeyError: field = 'числитель' if 'numerator' not in query else 'знаменатель' - return BAD_REQUEST, render_template( - TEXT_TEMPLATE_NAME, color=color, - text=BAD_REQUEST + ('
' + f'Указан неверный {field}') - ) + return BAD_REQUEST, get_error_template(f'Указан неверный {field}', color) except (ValueError, ZeroDivisionError) as e: - return BAD_REQUEST, render_template( - TEXT_TEMPLATE_NAME, color=color, - text=BAD_REQUEST + ('
' + str(e) if db.get_config_entry('show_errors') else '') - ) + return BAD_REQUEST, get_error_template(str(e), color) -@route(r'/show_errors/(\d{1})/?') def show_errors_get(query, *args): color = get_color() @@ -121,7 +57,6 @@ def show_errors_get(query, *args): ) -@route(r'/show_errors/?', ['POST']) def show_errors_post(query, *args): color = get_color() @@ -140,7 +75,6 @@ def show_errors_post(query, *args): ) -@route(r'/set_cookie/=/(.*)/?') def set_cookie_get(query, *args): cookie_line = args[0] color = get_color() @@ -152,13 +86,9 @@ def set_cookie_get(query, *args): return SUCCESS, render_template(TEXT_TEMPLATE_NAME, color=color, text='Cookie-файл обновлен') except ValueError as e: - return BAD_REQUEST, render_template( - TEXT_TEMPLATE_NAME, color=color, - text=BAD_REQUEST + ('
' + str(e) if db.get_config_entry('show_errors') else '') - ) + return BAD_REQUEST, get_error_template(str(e), color) -@route(r'/set_cookie/=/?', ['POST']) def set_cookie_post(query, *args): color = get_color() try: @@ -170,19 +100,12 @@ def set_cookie_post(query, *args): return SUCCESS, render_template(TEXT_TEMPLATE_NAME, color=color, text='Cookie-файл обновлен') except KeyError: - return BAD_REQUEST, render_template( - TEXT_TEMPLATE_NAME, color=color, - text=BAD_REQUEST + ('
' + f'Не указана строка с cookie') - ) + return BAD_REQUEST, get_error_template('Не указана строка с cookie', color) except ValueError as e: - return BAD_REQUEST, render_template( - TEXT_TEMPLATE_NAME, color=color, - text=BAD_REQUEST + ('
' + str(e) if db.get_config_entry('show_errors') else '') - ) + return BAD_REQUEST, get_error_template(str(e), color) -@route(r'/short_log/(\d{1})/?') def short_log_get(query, *args): color = get_color() @@ -201,7 +124,6 @@ def short_log_get(query, *args): ) -@route(r'/short_log/?', ['POST']) def short_log_post(query, *args): color = get_color() @@ -225,3 +147,11 @@ def get_color(): if color not in ['green', 'white']: color = 'white' return color + + +def get_error_template(text, color): + show_errors = db.get_config_entry('show_errors') + return render_template( + TEXT_TEMPLATE_NAME, color=color, + text = BAD_REQUEST + ('
' + text) if show_errors else '' + ) -- cgit v1.2.3