Перейти к содержанию

Описание проекта

Финальный проект

Ваш финальный проект — это сервис сокращения ссылок. Вы, скорее всего, встречались с таким сервисом в жизни, если не напрямую, то как клиент. Такими сервисами часто пользуются новостные сайты или маркетологи. Сервис микро блогов Twitter превращает все ссылки которые добавляют пользователи в специальные сокращенные версии, для того чтобы экономить место в твитах.

В чем суть работы сервиса. Пользователь может взять какую-то длинную ссылку и сократить ее. Например, вот ссылка на страницу с фотографией космонавта https://github.com/okumy/startbootstrap-clean-blog/blob/master/dist/assets/img/post-sample-image.jpg. Она даже визуально занимает очень много места и точно не поместится в SMS сообщение. Но если воспользоваться одним из популярных сервисов для сокращения ссылок Bitly.com то она сократится до https://bit.ly/3LWGm2R. Если вы откроете сокращенную ссылку, то браузер вас перенаправит на ту же страницу где вас ждет космонавт.

Ваша задача сделать сервис который позволит создавать сокращенные ссылки. Правда пока он будет работать только на вашем локальном компьютере.

Если перевести на язык заданий вам надо сделать проект который бы состоял из следующих пунктов:

- Подготовка основы проекта:
  - Сделать основу проекта
  - Выполнить git init
  - Скачать статику (можете воспользоваться обычным Bootstrap)
  - Добавить Makefile который позволит запускать проект
- Работа с базой:
  - Сделать схему базы данных проекта (мы это сделаем вместе)
- Регистрация и авторизация
  - Страница регистрации нового пользователя
  - Страница входа (login)
  - Страница выхода (logout)
- Главная страница:
  - Сделать рекламную главную страницу которая рекламирует сервис 
    (достаточно абзаца текста, о том что это лучший в мире сокращатель ссылок)
  - Сделать главную страницу для авторизированного пользователя на которой 
    будет список уже добавленных ссылок пользователя и форма добавления 
    новой ссылки
- Добавление ссылок:
  - Форма добавления ссылок должна проверяться
  - И сохраняться в базу, ссылке должен присваиваться уникальный код
- Страница редиректа:
  - Создать страницу с уникальным кодом, которая перенаправляет пользователя
    на целевую страницу в случае обращения к ней.

После реализации проекта опубликуйте его на Github в вашем портфолио.

Подсказки

Прежде чем двигаться дальше вот небольшие подсказки которые могут вам понадобиться во время работы.

Схема базы

Вот примерная схема базы данных которая вам понадобится:

CREATE TABLE users (
    id integer primary key autoincrement,
    name TEXT NOT NULL UNIQUE,
    password TEXT NOT NULL 
);

CREATE TABLE link (
    id integer primary key autoincrement,
    user_id INTEGER,
    long TEXT NOT NULL,
    PRIMARY KEY (contact_id, group_id),
    FOREIGN KEY (user_id) 
        REFERENCES users (user_id) 
            ON DELETE CASCADE 
            ON UPDATE NO ACTION
);

В таблице users место для хранения пользователей. Если пользователь регистрируется на сайте, то в таблицу добавляется новая запись. Мы не будем реализовывать восстановление пароля или связь через email. Достаточно будет у пользователя спросить его имя пользователя и чтобы оно было уникальным (вы можете проверить сделав запрос в таблицу и убедиться что не найдено ни одной записи с этим именем).

В таблице link будут храниться ссылки. Вы можете придумать свой алгоритм генерации уникальных кодов ссылок. Но в крайнем случае можете использовать просто номер строки в базе для поиска ссылки в таблице. Тогда ваша сокращалка будет работать таким образом. Например, в таблице link есть первая запись, которая хранит ссылку на другой сайт. Если пользователь откроет страницу, то его перенаправит на целевую страницу:

http://0.0.0.0:5000/1https://www.google.com/

Хранение паролей

Если выбудете хранить пароли в базе в открытом виде, то можете создать очень опасную ситуацию. Вдруг пользователь использует свой любимый пароль и имя на всех сайтах. Тогда если кто-то украдет вашу базу, то он сможет взломать ваших пользователей на других сайтах.

Для того чтобы этого не произошло использовать специальные алгоритмы. Пароли, вместо того чтобы хранить в открытом виде зашифровывают с помощью специального алгоритма и сохраняют в базу. Особенность работы этого алгоритма в том, что полученный результат невозможно расшифровать. Но можно попытаться зашифровать новую строку (от пользователя) и сравнить, и оба шифра совпадут, то значит обе строки одинаковые.

Вам надо будет установить специальную библиотеку pip install bcrypt (не забудьте ее добавить в requiements.txt). В коде это будет выглядеть приблизительно так:

import bcrypt

passwd = 's$cret12'.encode('utf-8')

salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(passwd, salt)

if bcrypt.checkpw(passwd, hashed):
    print("match")
else:
    print("does not match")

Библиотека bcrypt работает только с бинарными строками. Поэтому мы конвертируем строковую переменную в ее бинарное представление с помощью метода .encode() и в качестве целевой кодировки выбираем utf-8.

Например, на сайте регистрируется пользователь и передает нам свой пароль. А во время логина загружаем сохраненный зашифрованный хеш из базы и сравниваем функцией checkpw.

Вот псевдо-код:

import bcrypt
from flask import Flask

app = Flask(__name__)
app.secret = b'nooneknow'

@app.route('/register')
def register():
    form = RegisterForm()
    if form.valid():
        salt = bcrypt.gensalt() 
        password = form.password.data.encode('utf-8')
        password_hash = bcrypt.hashpw(password, salt)
        # сохраняем password_hash в базу

@app.route('/login')
def login():
    form = LoginForm()
    if form.valid():
        username = form.user.data
        user = get_user_from_db(username)
        password = form.password.data.encode('utf-8')
        if bcrypt.checkpw(password, user.hashed_pass):
            #  пароль совпал
        else:
            flash('Неправильный пароль')
            # ...

Конечно, этого кода недостаточно для полноценной регистрации и авторизации, но надеюсь этого кода достаточно для иллюстрации идеи.

Возможные доработки

Этот проект можно существенно дорабатывать. На самом деле в мире несколько компаний которые, стоят более миллиона долларов предоставляющие сервисы сокращения ссылок. Вы можете добавить:

  • сохранения статистики переходов
  • показывать qr код для ссылок
  • совместной работы над ссылками
  • возможность указывать краткое имя вручную

Для вдохновения можете зарегистрироваться на других сайтах и подсмотреть какие услуги они предоставляют своим пользователям.

Удачи в реализации вашего проекта!