summaryrefslogtreecommitdiff
path: root/day7
diff options
context:
space:
mode:
authorAndrew <saintruler@gmail.com>2019-06-03 21:28:50 +0400
committerAndrew <saintruler@gmail.com>2019-06-03 21:28:50 +0400
commit18617fd71708222fed455aac1d7d826d63ee3804 (patch)
tree489793d17507e8a313b45225ea80ac40d19789d3 /day7
parentd31296d87f86ca817b6d7c41c46bc83fe403a093 (diff)
Исправил некоторые недочеты, обновил README.md
Diffstat (limited to 'day7')
-rw-r--r--day7/README.md29
-rw-r--r--day7/http_handler.py5
-rw-r--r--day7/router.py6
-rw-r--r--day7/utils.py9
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']