Сервис сокращения ссылок
Вы должны реализоваться функционал следующего сайта:
Работа состоит из 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.parse
from 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
.