Простой сервис сокращения ссылок на FastAPI с хранением данных в PostgreSQL.
Проект умеет:
- создавать короткие ссылки;
- автоматически добавлять
https://, если пользователь вводит только домен; - редиректить по короткому коду;
- хранить ссылки в базе данных;
- отображать список всех ссылок в HTML-странице;
- запускаться локально и через Docker Compose.
- Создание короткой ссылки через API
- HTML-интерфейс для создания ссылок
- Страница со списком всех сохраненных ссылок
- Хранение данных в PostgreSQL
- Подсчет количества переходов по ссылке
- Кнопка копирования короткой ссылки
- Запуск через Docker Compose
- Python
- FastAPI
- PostgreSQL
- SQLAlchemy
- Jinja2
- JavaScript
- Docker
- Docker Compose
url_shortener/
├── app/
│ ├── main.py
│ ├── db.py
│ ├── models.py
│ ├── schemas.py
│ └── utils.py
├── templates/
│ ├── index.html
│ └── links.html
├── static/
│ ├── style.css
│ └── script.js
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── .env
├── .env.docker
└── README.md
- Пользователь вводит длинную ссылку на главной странице
- Сервис нормализует URL
- Генерируется короткий код
- Ссылка сохраняется в PostgreSQL
- Пользователь получает короткий URL
- При переходе по короткому URL происходит редирект на оригинальную ссылку
- Количество переходов увеличивается
git clone <URL_РЕПОЗИТОРИЯ>
cd url_shortenerpython3 -m venv venv
source venv/bin/activatepip install -r requirements.txtПример:
POSTGRES_DB=urlshortener
POSTGRES_USER=urluser
POSTGRES_PASSWORD=urlpass
POSTGRES_HOST=localhost
POSTGRES_PORT=5432Нужно, чтобы база и пользователь существовали.
Пример команд:
CREATE USER urluser WITH PASSWORD 'urlpass';
CREATE DATABASE urlshortener OWNER urluser;
GRANT ALL PRIVILEGES ON DATABASE urlshortener TO urluser;python -m uvicorn app.main:app --host 127.0.0.1 --port 8000После запуска приложение будет доступно по адресам:
http://127.0.0.1:8000/http://127.0.0.1:8000/docshttp://127.0.0.1:8000/links-page
Пример:
POSTGRES_DB=urlshortener
POSTGRES_USER=urluser
POSTGRES_PASSWORD=urlpass
POSTGRES_HOST=db
POSTGRES_PORT=5432docker compose up --buildhttp://localhost:8000/http://localhost:8000/docshttp://localhost:8000/links-page
GET /— главная страницаGET /links-page— страница со всеми ссылками
GET /health— проверка состояния сервисаPOST /shorten— создать короткую ссылкуGET /links— получить все ссылки в JSONGET /{code}— редирект на оригинальную ссылку
curl -X POST "http://127.0.0.1:8000/shorten" \
-H "Content-Type: application/json" \
-d '{"url":"google.com"}'Пример ответа:
{
"original_url": "https://google.com",
"short_code": "Ab12Cd",
"short_url": "http://127.0.0.1:8000/Ab12Cd"
}