Сервис сокращения ссылок

Вы должны реализоваться функционал следующего сайта:

Работа состоит из 2 частей:

  • Базовый функционал сокращения ссылок. Список уже сгенерированных ссылок будет глобальным(виден всем посетителям)
  • Регистрация/авторизация пользователей.

Базовый функционал

Для реализации базового функционала вам предстоить сверстать главную страницу состоящую из:

  • Формы добавления новых ссылок
  • Таблицы уже созданных ссылок
  • Поздравительного сообщения о создании нового

Создание таблицы в базе данных

CREATE TABLE links (
id SERIAL PRIMARY KEY,
original_url TEXT,
code VARCHAR(6),
views_count INT,
create_at TIMESTAMP,
);

Что следует реализовать

В первую очередь вам следует сверстать описанную страницу и добавить роуты:

  • / - Главная страница Если в URL присутствует параметр success=<link_id> вы должны показать страницу с блоком поздравления о создании новой ссылки.

    Т.е при открытии например такой страницы: /?success=1 вам покажется сообщение о том что ссылка c id==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.1
    Content-Type: application/x-www-formurlencoded
    url=<содержимое поля 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_qs
    example_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.,@?^=%&amp;:\/~+#-]*[\w@?^=%&amp;\/~+#-])?")
    URL_RE.match("some_string") # None
    URL_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.