summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--day7/README.md92
-rw-r--r--day7/backend.py4
2 files changed, 72 insertions, 24 deletions
diff --git a/day7/README.md b/day7/README.md
index 82f5d5c..725990d 100644
--- a/day7/README.md
+++ b/day7/README.md
@@ -1,9 +1,57 @@
# BrandNewServer Модули
-## templater.py
-### `render_template(template_name, **kwargs)`
-Нам постоянно нужно присылать однотипные HTML-странички и для этого пригодится HTML-шаблонизатор,
-который может по небольшому количеству изменяемых параметров вернуть готовую страницу.
+## backend.py
+### `route(url_format, methods)`
+> *Используется как декоратор.*
+
+Указание при каком url и методах в запросе должна вызываться декорируемая функция.
+При инициализации декоратора надо указать url регулярное выражение и http методы.
+В декорируемую функцию передаются параметры query из тела запроса и сматченные группы
+из регулярного выражения `url_format`. Добавляет декорируемые функции в дерево роутера.
+
+### `run(request)`
+Принимает разобранный http-запрос, добавляет новые cookie-данные в базу данных.
+Ищет в дереве роутера функцию, которую необходимо вызвать для обработки текущего запроса.
+При нахождении такой функции передает ей все необходимые данные о запросе.
+Если подходящая функция не была найдена возвращает обработчику статус `404 Not Found`.
+
+### Пользовательские функции
+
+### `get_color()`
+Специфичная для этой программы функция. Возвращает цвет фона, который
+должен быть у каждой возвращаемой страницы.
+
+### `fallback_wrong_method(query, *args)`
+Вызывается при любом url, если http-метод не GET или POST.
+Возвращает обработчику статус `405 Method Not Allowed`
+
+### `index_get(query, *args)`
+Содержит страницу с формой из которой можно отправлять все остальные соответствующие запросы.
+С этой страницы запросы отсылаются на 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 из задания.
+
+## config.py
+Файл содержит конфикурационные переменные для программы.
+
+## db.py
+Для хранения данных используется shelve.
+
+### `set_cookie(key, value)`
+Добавляет/Обновляет данные в cookies-базе данных
+
+### `get_cookie(key, default)`
+Получение значения из cookie-базы данных.
+
+### `set_config_entry(key, value)`
+Добавляет/Обновляет данные в базу данных конфигурации сервера.
+
+### `get_config_entry(key, default=None)`
+Получение значения из базы данных конфигурации сервера.
## http_handler.py
### `main(host, port)`
@@ -11,18 +59,18 @@
обрабатывается остановка сервера при нажатии `Ctrl+C`
### `log_requests(func)`
-*Используется как декоратор.*
+> *Используется как декоратор.*
-Логирует все запросы, приходящие в функцию `process_request`.
+Логирует в файл все запросы, приходящие в функцию `process_request`.
-### `get_request(connection)`
+### `parse_request(connection)`
Принимаем запрос от клиента и тут же парсим заголовки. Если в теле
-запроса приходят дополнительные данные, то они тут тоже обрабатываются.
+запроса приходят дополнительные данные, то они тоже обрабатываются.
-### `process_request(address, method, url, http_ver, headers, query)`
-*Эта функция логируется с помощью функции* `log_func`
+### `process_request(address, request)`
+> *Эта функция логируется с помощью функции* `log_func`
-Проверяется валидность url, парсятся Cookie-заголовки. Если url валиден,
+Проверяется валидность url. Если url валиден,
то запрос отправляется на обработку в `backend.py`.
### `handle_connection(connection, address)`
@@ -35,22 +83,22 @@
Специфичная для этой программы функция. Возвращает цвет фона, который
должен быть у каждой возвращаемой страницы.
+## templater.py
+### `render_template(template_name, **kwargs)`
+Нам постоянно нужно присылать однотипные HTML-странички и для этого пригодится HTML-шаблонизатор,
+который может по небольшому количеству изменяемых параметров вернуть готовую страницу.
+При каждом вызове шаблон загружается заново, поэтому нет необходимости перезагружать сервер при изменении шаблона.
+
## utils.py
Константы для ответов в http запросах.
Функции, необходимые для обработки любых http-запросов.
-* `add_headers(status, html)`: добавляет заголовки к ответной html-странице
-* `validate_url(url)`: проверка url на правильность
+* `add_text_headers(status, html)`: добавляет заголовки к ответной html-странице
+* `validate_url(url)`: проверка url на валидность.
+* `validate_first_line(line)`: проверка первой строки http-запроса на валидность.
* `parse_cookies(cookies_line)`: парсинг cookies
+* `format_cookies(cookies)`: формирование cookie-строки из переданного словаря.
* `parse_headers(request_line)`: парсинг заголовков
* `parse_query(query_line)`: парсинг параметров в теле заголовка
* `url_decoder(url_line)`: [декодирование url](https://en.wikipedia.org/wiki/Percent-encoding)
-
-## backend.py
-### `route(url_format, methods)`
-*Используется как декоратор.*
-
-Указание при каком url и методах в запросе должна вызываться декорируемая функция.
-При инициализации декоратора надо указать url регулярное выражение и http методы.
-В декорируемую функцию передаются параметры query из тела запроса и сматченные группы
-из регулярного выражения `url_format`.
+* `url_encoder(line)`: [кодирование url](https://en.wikipedia.org/wiki/Percent-encoding)
diff --git a/day7/backend.py b/day7/backend.py
index e49bfe1..b3a8cd2 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_text_headers, SUCCESS, BAD_REQUEST, NOT_FOUND, HTTP_METHODS
+from utils import parse_cookies, add_text_headers, SUCCESS, BAD_REQUEST, NOT_FOUND, HTTP_METHODS, METHOD_NOT_ALLOWED
from config import TEXT_TEMPLATE_NAME
import db
@@ -55,7 +55,7 @@ def run(request):
# По заданию любой метод, кроме GET и POST должны быть запрещены на сервере.
@route('/.*', list(set(HTTP_METHODS) ^ {'GET', 'POST'}))
def fallback_wrong_method(query, *args):
- return NOT_FOUND, 'This method is not allowed'
+ return METHOD_NOT_ALLOWED, 'This method is not allowed'
@route('/')