Сервис сокращения ссылок
Вы должны реализоваться функционал следующего сайта:
Работа состоит из 2 частей:
- Базовый функционал сокращения ссылок. Список уже сгенерированных ссылок будет глобальным(виден всем посетителям)
 - Регистрация/авторизация пользователей.
 
Базовый функционал
Для реализации базового функционала вам предстоить сверстать главную страницу состоящую из:
- Формы добавления новых ссылок
 - Таблицы уже созданных ссылок
 - Поздравительного сообщения о создании нового
 
Создание таблицы в базе данных
Что следует реализовать
В первую очередь вам следует сверстать описанную страницу и добавить роуты:
/- Главная страница Если вURLприсутствует параметрsuccess=<link_id>вы должны показать страницу с блоком поздравления о создании новой ссылки.Т.е при открытии например такой страницы:
/?success=1вам покажется сообщение о том что ссылка cid==1успешно создана и будет показана сама ссылка(сокращенная)./create_link- Создание ссылки в таблицеlinks. При отправки формы на этот адрес, в таблице создается новая ссылка, а после того как линк создан, возвращается ответ с кодом302(REDIRECT)и заголовкомLocation: /?success=<id созданной ссылки>.Данные формы будут переданы в формате
application/x-www-formurlencoded. Вот вам мини-версия формы:<form action="/create_link" method="POST"><input name="url" /></form>При отправке подобной формы.. на сервер придет примерно такой запрос:
POST /create_link HTTP/1.1Content-Type: application/x-www-formurlencodedurl=<содержимое поля url>Подсказка #1
Создание записи в таблице
links:INSERT INTO links (original_url, code, create_at) VALUES (%s, %s, %s);Как это делать через
psycopg2:cur = connection.cursor()cur.execute("INSERT INTO links (original_url, code, create_at) VALUES (%s, %s, %s) RETURNING id, code;", (original_url, generated_code, datetime.now()))(link_id, link_code) = cur.fetchone()connection.commit()Подсказка #2
Для того чтобы обработать данные формы в формате
application/x-www-formurlencodedвы могли бы воспользоваться регулярными выражениями и это даже работало бы. Но в стандартной библиотекеPythonесть уже готовый метод для парсинга строк в форматеapplication/x-www-formurlencoded.Для парсинга тела запроса мы можем воспользоваться библиотекой
urllib.parsefrom urllib.parse import parse_qsexample_qs = "url=test"print(parse_qs(example_qs)) # {"url": ["test"]}example_qs = "url=test&foo=test2"print(parse_qs(example_qs)) # {"url": ["test"], "foo": ["test2"]}Подсказка #3
Для валидации полученных от клиента данных нам потребуется воспользоваться регулярными выражениями (модулем
re)import re# Регулярка для проверки, является ли строка URL`омURL_RE = re.compile(r"(?:http|https):\/\/((?:[\w-]+)(?:\.[\w-]+)+)(?:[\w.,@?^=%&:\/~+#-]*[\w@?^=%&\/~+#-])?")URL_RE.match("some_string") # NoneURL_RE.match("http://www.google.com/") # <Match ....>
/<code>- Вместо<code>будет подставлен код из 6 символов. При переходе по такой ссылке вы должны получить ссылку из таблицыlinksпо ее колонкеcodeи вернуть пользователю ответ с статусом302и заголовкомLocationв который будет подставлен оригинальный УРЛ.
Шаги
-  Новый 
Route('/')который возвращает главную страницу сгенерированную шаблонизоторомJinja2 -  Создать сервис 
LinksServiceс методами:getAllLinks()createNewLink(original_url)
 -  Реализовать метод 
createNewLink(original_url), метод должен создать новую запись в БД. -  Новая 
view-function(например:create_link_handler(req) -> res). -  Добавить новый роут 
Route('/create_link'). -  Настроить отправку формы на URI 
/create_link. 
