diff options
| -rw-r--r-- | day7/README.md | 29 | ||||
| -rw-r--r-- | day7/http_handler.py | 5 | ||||
| -rw-r--r-- | day7/router.py | 6 | ||||
| -rw-r--r-- | day7/utils.py | 9 |
4 files changed, 30 insertions, 19 deletions
diff --git a/day7/README.md b/day7/README.md index c4d23ea..73b3003 100644 --- a/day7/README.md +++ b/day7/README.md @@ -1,6 +1,15 @@ # BrandNewServer Модули -## backend.py +## router.py +### `Route` +Представляет из себя класс роута. При инициализации принимает допустимые +методы и регулярное выражение. Содержит методы для работы роутинга. +Чтобы созданный путь стал обрабатываться необходимо поместить объект Route в таблицу роутера. + +* `check_route(url, method)`: По указанным URL и методу проверят подходит ли URL под соответсвующие настройки пути. +* `invoke_callback(url, method, query)`: Как и `check_route` проверяет параметр на валидность, но если он валиден, то + вызывается соответствующий обработчик. + ### `route(url_format, methods)` > *Используется как декоратор.* @@ -11,16 +20,19 @@ ### `run(request)` Принимает разобранный http-запрос, добавляет новые cookie-данные в базу данных. -Ищет в дереве роутера функцию, которую необходимо вызвать для обработки текущего запроса. +Ищет в таблице роутера функцию, которую необходимо вызвать для обработки текущего запроса. При нахождении такой функции передает ей все необходимые данные о запросе. Если подходящая функция не была найдена возвращает обработчику статус `404 Not Found`. +## backend.py ### Пользовательские функции - ### `get_color()` Специфичная для этой программы функция. Возвращает цвет фона, который должен быть у каждой возвращаемой страницы. +### `get_error_template(text, color)` +Генерирует страницу с ошибкой. + ### `fallback_wrong_method(query, *args)` Вызывается при любом url, если http-метод не GET или POST. Возвращает обработчику статус `405 Method Not Allowed` @@ -30,10 +42,10 @@ С этой страницы запросы отсылаются на POST-версии обработчиков, которые работают эквивалентно GET-обработчикам. Далее будут описаны только GET-версии обработчиков. -* divide_get(query, *args): Делит одно число на другое, доставая эти числа из url запроса. -* show_errors_get(query, *args): Включает/выключает опцию show_errors из задания. -* set_cookie_get(query, *args): Добавляет/обновляет cookie-записи в локальной базе данных. -* short_log_get(query, *args): Включает/выключает опцию short_log из задания. +* `divide_get(query, *args)`: Делит одно число на другое, доставая эти числа из url запроса. +* `show_errors_get(query, *args)`: Включает/выключает опцию show_errors из задания. +* `set_cookie_get(query, *args)`: Добавляет/обновляет cookie-записи в локальной базе данных. +* `short_log_get(query, *args)`: Включает/выключает опцию short_log из задания. ## main.py Обрабатывает переданные аргументы командной строки, инициализирует @@ -58,7 +70,8 @@ GET-обработчикам. Далее будут описаны только Получение значения из базы данных конфигурации сервера. ## http_handler.py -### `main(host, port)` +### `main()` +Адрес хоста берется из базы данных конфигурации. Запускает сервер по адресу `host:port`. Также тут обрабатывается остановка сервера при нажатии `Ctrl+C` diff --git a/day7/http_handler.py b/day7/http_handler.py index 7f64f95..8344d7f 100644 --- a/day7/http_handler.py +++ b/day7/http_handler.py @@ -17,10 +17,7 @@ logging.basicConfig(filename=db.get_config_entry('log_path'), level=logging.INFO def log_requests(func): - def wrapper(*args, **kwargs): - address = kwargs['address'] if 'address' in kwargs else args[0] - request = kwargs['request'] if 'request' in kwargs else args[1] - + def wrapper(address, request, *args, **kwargs): response = func(*args, **kwargs) status = response.split('\n').pop(0).split()[1] diff --git a/day7/router.py b/day7/router.py index b0705c3..c662592 100644 --- a/day7/router.py +++ b/day7/router.py @@ -45,7 +45,7 @@ def route(url_format, methods=None): # Благодаря этому указывать паттерн url и метод нужно указывать # только в инициализаторе декоратора, а функция run сама разберется # при каких условиях нужно вызвать конкретную функцию - _router_tree.append(Route(func, url_format, methods)) + _router_table.append(Route(func, url_format, methods)) return inner return wrapper @@ -59,7 +59,7 @@ def run(request): method, url = request['method'], request['url'] - for route in _router_tree: + for route in _router_table: if route.check_route(url, method): res = route.invoke_callback(url, method, request['query']) break @@ -67,7 +67,7 @@ def run(request): return add_text_headers(*res) -_router_tree = [ +_router_table = [ # Пока ничего лучше не придумал Route(fallback_wrong_method, '/.*', list(set(HTTP_METHODS) ^ {'GET', 'POST'})), diff --git a/day7/utils.py b/day7/utils.py index c58c014..c17a02d 100644 --- a/day7/utils.py +++ b/day7/utils.py @@ -2,10 +2,11 @@ import re from time import strftime, gmtime from string import ascii_letters -BAD_REQUEST = 'HTTP/1.1 400 Bad Request' -NOT_FOUND = 'HTTP/1.1 404 Not Found' -SUCCESS = 'HTTP/1.1 200 OK' -METHOD_NOT_ALLOWED = 'HTTP/1.1 405 Method Not Allowed' +HTTP_VERSION = 'HTTP/1.1' +SUCCESS = f'{HTTP_VERSION} 200 OK' +BAD_REQUEST = f'{HTTP_VERSION} 400 Bad Request' +NOT_FOUND = f'{HTTP_VERSION} 404 Not Found' +METHOD_NOT_ALLOWED = f'{HTTP_VERSION} Method Not Allowed' HTTP_METHODS = ['GET', 'POST', 'OPTIONS', 'HEAD', 'PUT', 'PATCH', 'DELETE', 'TRACE', 'CONNECT'] |