diff options
Diffstat (limited to 'day7/README.md')
| -rw-r--r-- | day7/README.md | 160 |
1 files changed, 39 insertions, 121 deletions
diff --git a/day7/README.md b/day7/README.md index 73b3003..8bd962f 100644 --- a/day7/README.md +++ b/day7/README.md @@ -1,134 +1,52 @@ -# BrandNewServer Модули +# BrandNewServer -## router.py -### `Route` -Представляет из себя класс роута. При инициализации принимает допустимые -методы и регулярное выражение. Содержит методы для работы роутинга. -Чтобы созданный путь стал обрабатываться необходимо поместить объект Route в таблицу роутера. +## Что это? +Brand-new HTTP сервер для созданный для того, чтобы похвастаться перед одноклассниками. +Да, я могу сделать кривой HTTP сервер! -* `check_route(url, method)`: По указанным URL и методу проверят подходит ли URL под соответсвующие настройки пути. -* `invoke_callback(url, method, query)`: Как и `check_route` проверяет параметр на валидность, но если он валиден, то - вызывается соответствующий обработчик. +## Как использовать? +Есть два способа создать обработчик пути: -### `route(url_format, methods)` -> *Используется как декоратор.* +1. * Написать функцию. + * Создать объект Route, который будет вызывать эту функцию по заданному пути. + * Добавить этот объект в список _router_table (Находится в модуле router.py). + +2. * Написать функцию. + * Добавить к ней декоратор @route. -Указание при каком url и методах в запросе должна вызываться декорируемая функция. -При инициализации декоратора надо указать url регулярное выражение и http методы. -В декорируемую функцию передаются параметры query из тела запроса и сматченные группы -из регулярного выражения `url_format`. Добавляет декорируемые функции в дерево роутера. +Изнутри оба этих метода делают абсолютно одно и то же: второй способ сам создает объект Route и добавляет +его в _router_table. -### `run(request)` -Принимает разобранный http-запрос, добавляет новые cookie-данные в базу данных. -Ищет в таблице роутера функцию, которую необходимо вызвать для обработки текущего запроса. -При нахождении такой функции передает ей все необходимые данные о запросе. -Если подходящая функция не была найдена возвращает обработчику статус `404 Not Found`. +Первый способ рекомендуется для увеличения читабельности кода и централизации настроек роутера. -## backend.py -### Пользовательские функции -### `get_color()` -Специфичная для этой программы функция. Возвращает цвет фона, который -должен быть у каждой возвращаемой страницы. +Второй способ подойдет для небольших проектов на 2-3 обработчика. -### `get_error_template(text, color)` -Генерирует страницу с ошибкой. +Свои функции можно писать в любом файле (В модулях самого сервера всё таки не рекомендуется, но никто не запрещает). +В данном случае все обработчики находятся в модуле `backend.py` и использован первый способ задания путей +(Они прописаны прямо в _router_table). -### `fallback_wrong_method(query, *args)` -Вызывается при любом url, если http-метод не GET или POST. -Возвращает обработчику статус `405 Method Not Allowed` +## Как запустить? +Для запуска сервера введите в консоли `python3 main.py` -### `index_get(query, *args)` -Содержит страницу с формой из которой можно отправлять все остальные соответствующие запросы. -С этой страницы запросы отсылаются на POST-версии обработчиков, которые работают эквивалентно -GET-обработчикам. Далее будут описаны только GET-версии обработчиков. +Аргументы командной строки: +* `--chunk-size %SIZE%`: Количество байт, которое сервер считывает из сокета за один раз (По умолчанию - 1024). +* `--bg-color %COLOR%`: Устанавливает цвет фона страниц на сайте (По умолчанию - белый). +* `--short-log`: Включает режим короткого лога (По умолчанию - выключен). +* `--show-errors`: Включает режим показа всех ошибок (По умолчанию - выключен). +* `--log %PATH%`: Путь до файла с логом (По умолчанию - logs/log.log). +* `--cookies-db %PATH%`: Путь до файла хранения приходящих cookies (По умолчанию - выключен). +* `--host %HOST%`: Адрес, на котором запустится сервер (По умолчанию - 0.0.0.0). +* `--port %PORT%`: Порт, на котором запустится сервер (По умолчанию - 8888). -* `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` записаны некоторые настройки, которые неудобно задавать через командную строку. +Также тут можно хранить пользовательские переменные. +* `TEXT_TEMPLATE_NAME`: (*Пользовательская переменная*) Название шаблона с обычной текстовой страницей. +* `FORM_TEMPLATE_NAME`: (*Пользовательская переменная*) Название шаблона с формой страницей. +* `CONFIG_DB_PATH`: Путь до файла с конфигурацией сервера. -## main.py -Обрабатывает переданные аргументы командной строки, инициализирует -базу данных с конфигурацией сервера и запускает его. - -## 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`. Также тут -обрабатывается остановка сервера при нажатии `Ctrl+C` - -### `log_requests(func)` -> *Используется как декоратор.* - -Логирует в файл все запросы, приходящие в функцию `process_request`. - -### `parse_request(connection)` -Принимаем запрос от клиента и тут же парсим заголовки. Если в теле -запроса приходят дополнительные данные, то они тоже обрабатываются. - -### `process_request(address, request)` -> *Эта функция логируется с помощью функции* `log_func` - -Проверяется валидность url. Если url валиден, -то запрос отправляется на обработку в `backend.py`. - -### `handle_connection(connection, address)` -Как только к серверу присоединяется какой-то клиент, -то это соединение обрабатывается тут. С помощью `get_request` -принимаются заголовки и отправляются в `process_request`. Ответ -клиенту, полученный из бекэнда, отправляется тут. - -### `get_color()` -Специфичная для этой программы функция. Возвращает цвет фона, который -должен быть у каждой возвращаемой страницы. - -## templater.py -### `render_template(template_name, **kwargs)` -Нам постоянно нужно присылать однотипные HTML-странички и для этого пригодится HTML-шаблонизатор, -который может по небольшому количеству изменяемых параметров вернуть готовую страницу. -При каждом вызове шаблон загружается заново, поэтому нет необходимости перезагружать сервер при изменении шаблона. - -## utils.py -Константы для ответов в http запросах. - -Функции, необходимые для обработки любых http-запросов. -* `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) -* `url_encoder(line)`: [кодирование url](https://en.wikipedia.org/wiki/Percent-encoding) - -# Директории Перед запуском сервера необходимо предварительно создать следующие директории: -## db -По умолчанию в этой директории создадутся базы данных сервера. - -## logs -По умолчанию в эту директорию будет записываться лог сервера. - -## templates -Для использования шаблонизатора сервер **должен** содержать в рабочей директории -папку templates в которой будут находиться все html-шаблоны. +* `db`: По умолчанию в этой директории создадутся базы данных сервера. +* `logs`: По умолчанию в эту директорию будет записываться лог сервера. +* `templates`: Для использования шаблонизатора сервер **должен** содержать в рабочей директории + папку templates в которой будут находиться все html-шаблоны. |