Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

News API

RESTful API для управления новостями, пользователями и комментариями, построенное на FastAPI с системой авторизации через JWT и GitHub OAuth.

Стек технологий

  • Python 3.10+
  • FastAPI
  • SQLAlchemy 2.0
  • PostgreSQL
  • Alembic
  • Pydantic
  • JWT (python-jose)
  • Argon2 (хеширование паролей)
  • httpx (GitHub OAuth)

Пошаговая инструкция по запуску проекта

Шаг 1: Предварительные требования

Убедитесь, что установлены:

  • Python 3.10 или выше
  • PostgreSQL
  • pip
  • git (опционально)

Шаг 2: Клонирование репозитория

git clone <repository-url>
cd lab2_Ponomarenko_P_P

Шаг 3: Создание виртуального окружения

# Windows
python -m venv venv

# Linux/Mac
python3 -m venv venv

Шаг 4: Активация виртуального окружения

Windows PowerShell:

.\venv\Scripts\Activate.ps1

Если появится ошибка "execution of scripts is disabled":

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Затем снова выполните .\venv\Scripts\Activate.ps1

Windows CMD:

venv\Scripts\activate.bat

Linux/Mac:

source venv/bin/activate

После активации в начале строки терминала должно появиться (venv).

ВАЖНО: После активации проверьте, что используется правильный Python:

# Windows
where python
# Должен показать: C:\Users\...\lab2_Ponomarenko_P_P\venv\Scripts\python.exe

# Linux/Mac
which python
# Должен показать путь к venv/bin/python

Если показывает системный Python, значит активация не сработала. Используйте полный путь:

.\venv\Scripts\python.exe -m uvicorn app.main:app --reload

Шаг 5: Установка зависимостей

ВАЖНО: Убедитесь, что виртуальное окружение активировано (в начале строки должно быть (venv)).

pip install -r requirements.txt

Если видите ошибку "ModuleNotFoundError: No module named 'sqlalchemy'" или подобную:

  1. Проверьте активацию виртуального окружения:

    # Windows PowerShell
    venv\Scripts\Activate.ps1
    
    # Windows CMD
    venv\Scripts\activate.bat
    
    # Linux/Mac
    source venv/bin/activate
  2. Проверьте, что используете правильный Python:

    # Должен показать путь к venv
    where python  # Windows
    which python  # Linux/Mac
  3. Обновите pip перед установкой:

    python -m pip install --upgrade pip
  4. Установите зависимости заново:

    pip install -r requirements.txt
  5. Проверьте установку:

    pip list | findstr sqlalchemy  # Windows
    pip list | grep sqlalchemy     # Linux/Mac

    Должна быть видна строка с sqlalchemy 2.0.23.

Шаг 6: Настройка базы данных PostgreSQL

  1. Запустите PostgreSQL сервер
  2. Создайте базу данных:
CREATE DATABASE news_db;
  1. Проверьте подключение (опционально):
psql -U postgres -d news_db

Шаг 7: Создание файла .env

Создайте файл .env в корне проекта со следующим содержимым:

# Database
POSTGRES_SERVER=localhost
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DB=news_db

# JWT Settings
JWT_SECRET_KEY=your-secret-key-change-in-production-min-32-chars
JWT_ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
REFRESH_TOKEN_EXPIRE_DAYS=30

# GitHub OAuth (для локального тестирования можно использовать моковые значения)
GITHUB_CLIENT_ID=mock_client_id
GITHUB_CLIENT_SECRET=mock_client_secret
GITHUB_REDIRECT_URI=http://localhost:8000/api/v1/auth/github/callback

Важно:

  • Замените POSTGRES_PASSWORD на ваш реальный пароль PostgreSQL
  • Замените JWT_SECRET_KEY на случайную строку минимум 32 символа
  • Для реального использования GitHub OAuth зарегистрируйте приложение на https://github.com/settings/developers

Шаг 8: Применение миграций базы данных

alembic upgrade head

Эта команда создаст все необходимые таблицы:

  • users (с полями для авторизации)
  • news
  • comments
  • refresh_sessions

Шаг 9: Запуск сервера

ВАЖНО: Убедитесь, что виртуальное окружение активировано! В начале строки должно быть (venv).

uvicorn app.main:app --reload

Если видите ошибку "ModuleNotFoundError", проверьте:

  1. Виртуальное окружение активировано:

    # Должно быть видно (venv) в начале строки
    # Если нет, активируйте:
    # Windows
    venv\Scripts\activate
    # Linux/Mac
    source venv/bin/activate
  2. Используется правильный Python:

    # Проверьте путь к Python
    where python  # Windows
    which python  # Linux/Mac
    # Должен быть путь к venv\Scripts\python.exe или venv/bin/python
  3. Запустите через Python модуль (более надежный способ):

    python -m uvicorn app.main:app --reload

Сервер запустится на http://localhost:8000

Для запуска в фоновом режиме (опционально):

# Windows PowerShell
Start-Process uvicorn -ArgumentList "app.main:app --reload"

# Linux/Mac
uvicorn app.main:app --reload &

Шаг 10: Проверка запуска

Откройте в браузере:

Должен вернуться JSON с информацией о статусе API.

Пошаговая проверка работы API

Проверка 1: Регистрация нового пользователя

Команда:

curl -X POST "http://localhost:8000/api/v1/auth/register" \
  -H "Content-Type: application/json" \
  -d "{\"name\": \"Иван Иванов\", \"email\": \"ivan@example.com\", \"password\": \"password123\"}"

Ожидаемый результат:

{
  "access_token": "eyJ...",
  "refresh_token": "eyJ...",
  "token_type": "bearer"
}

Сохраните access_token и refresh_token для следующих шагов!

Проверка 2: Вход существующего пользователя

Команда:

curl -X POST "http://localhost:8000/api/v1/auth/login" \
  -H "Content-Type: application/json" \
  -d "{\"email\": \"ivan@example.com\", \"password\": \"password123\"}"

Ожидаемый результат: Новые токены доступа.

Проверка 3: Получение списка пользователей (требует авторизации)

Команда:

curl -X GET "http://localhost:8000/api/v1/users/" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Замените YOUR_ACCESS_TOKEN на токен из шага 1.

Ожидаемый результат: Список пользователей в формате JSON.

Проверка 4: Попытка доступа без токена (должна вернуть ошибку)

Команда:

curl -X GET "http://localhost:8000/api/v1/users/"

Ожидаемый результат:

{
  "detail": "Not authenticated"
}

Проверка 5: Создание новости (требует верифицированного автора)

Шаг 5.1: Сначала нужно сделать пользователя верифицированным автором через админ-панель или напрямую в БД:

UPDATE users SET is_verified_author = true WHERE email = 'ivan@example.com';

Шаг 5.2: Создание новости:

curl -X POST "http://localhost:8000/api/v1/news/" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "title=Тестовая новость" \
  -d "content={\"paragraphs\": [\"Первый абзац\", \"Второй абзац\"]}" \
  -d "cover_url=https://example.com/image.jpg"

Ожидаемый результат: Созданная новость с ID.

Проверка 6: Попытка создать новость неверифицированным пользователем

Шаг 6.1: Создайте нового пользователя (не верифицированного):

curl -X POST "http://localhost:8000/api/v1/auth/register" \
  -H "Content-Type: application/json" \
  -d "{\"name\": \"Обычный пользователь\", \"email\": \"user@example.com\", \"password\": \"password123\"}"

Шаг 6.2: Попытка создать новость:

curl -X POST "http://localhost:8000/api/v1/news/" \
  -H "Authorization: Bearer NEW_USER_ACCESS_TOKEN" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "title=Новость" \
  -d "content={\"paragraphs\": [\"Текст\"]}"

Ожидаемый результат:

{
  "detail": "Only verified authors can perform this action"
}

Проверка 7: Получение списка новостей

Команда:

curl -X GET "http://localhost:8000/api/v1/news/" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Ожидаемый результат: Список всех новостей.

Проверка 8: Создание комментария (любой авторизованный пользователь)

Команда:

curl -X POST "http://localhost:8000/api/v1/comments/" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "text=Отличная новость!" \
  -d "news_id=1"

Замените news_id=1 на ID новости из шага 5.

Ожидаемый результат: Созданный комментарий.

Проверка 9: Редактирование своей новости

Команда:

curl -X PUT "http://localhost:8000/api/v1/news/1" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "title=Обновленный заголовок"

Ожидаемый результат: Обновленная новость.

Проверка 10: Попытка редактировать чужую новость (должна вернуть ошибку)

Команда:

curl -X PUT "http://localhost:8000/api/v1/news/1" \
  -H "Authorization: Bearer NEW_USER_ACCESS_TOKEN" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "title=Попытка изменить"

Ожидаемый результат:

{
  "detail": "You can only edit your own news"
}

Проверка 11: Обновление токена (Refresh Token)

Команда:

curl -X POST "http://localhost:8000/api/v1/auth/refresh" \
  -H "Content-Type: application/json" \
  -d "{\"refresh_token\": \"YOUR_REFRESH_TOKEN\"}"

Ожидаемый результат: Новые access_token и refresh_token.

Проверка 12: Получение активных сессий

Команда:

curl -X GET "http://localhost:8000/api/v1/auth/me/sessions" \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN"

Ожидаемый результат: Список активных сессий с информацией о User-Agent.

Проверка 13: Выход из системы (Logout)

Команда:

curl -X POST "http://localhost:8000/api/v1/auth/logout" \
  -H "Content-Type: application/json" \
  -d "{\"refresh_token\": \"YOUR_REFRESH_TOKEN\"}"

Ожидаемый результат: 204 No Content

Проверка 14: GitHub OAuth (опционально, если настроен)

Шаг 14.1: Откройте в браузере:

http://localhost:8000/api/v1/auth/github/login

Шаг 14.2: После авторизации через GitHub вы будете перенаправлены на callback URL с токенами.

Примечание: Для работы GitHub OAuth нужно зарегистрировать приложение на GitHub и указать реальные GITHUB_CLIENT_ID и GITHUB_CLIENT_SECRET в .env.

Проверка через Swagger UI (интерактивная документация)

  1. Откройте http://localhost:8000/docs
  2. Нажмите кнопку "Authorize" в правом верхнем углу
  3. Введите токен в формате: Bearer YOUR_ACCESS_TOKEN
  4. Теперь можно тестировать все endpoints через интерфейс Swagger

Проверка через Postman

Настройка коллекции:

  1. Создайте новую коллекцию "News API"

  2. Добавьте переменную коллекции:

    • base_url: http://localhost:8000/api/v1
    • access_token: (будет заполнено после регистрации/входа)
    • refresh_token: (будет заполнено после регистрации/входа)
  3. Настройте авторизацию для коллекции:

    • Type: Bearer Token
    • Token: {{access_token}}
  4. Создайте запросы:

    • Register (POST /auth/register)
    • Login (POST /auth/login)
    • Get Users (GET /users/)
    • Create News (POST /news/)
    • Get News (GET /news/)
    • Create Comment (POST /comments/)
    • Refresh Token (POST /auth/refresh)
    • Logout (POST /auth/logout)

Возможные проблемы и решения

Проблема: Ошибка подключения к базе данных

Решение:

  • Проверьте, что PostgreSQL запущен
  • Проверьте правильность данных в .env
  • Убедитесь, что база данных news_db создана

Проблема: Ошибка "ModuleNotFoundError: No module named 'sqlalchemy'" или подобная

Причины:

  • Виртуальное окружение не активировано при запуске сервера
  • Используется системный Python вместо venv
  • Зависимости установлены в другое окружение

Решение пошагово:

  1. Проверьте, что пакеты установлены:

    pip list

    Должны быть видны: SQLAlchemy, fastapi, uvicorn и другие.

    Если пакеты есть в списке, но ошибка все равно возникает, значит проблема в активации окружения.

  2. Убедитесь, что виртуальное окружение активировано:

    # Windows PowerShell
    .\venv\Scripts\Activate.ps1
    
    # Если ошибка "execution of scripts is disabled", выполните:
    Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
    
    # Windows CMD
    venv\Scripts\activate.bat
    
    # Linux/Mac
    source venv/bin/activate

    После активации в начале строки должно появиться (venv).

  3. Проверьте, что используете Python из venv:

    # Windows
    where python
    # Должен показать путь типа: C:\Users\...\lab2_Ponomarenko_P_P\venv\Scripts\python.exe
    
    # Linux/Mac
    which python
    # Должен показать путь типа: /path/to/lab2_Ponomarenko_P_P/venv/bin/python
  4. Запускайте сервер через Python модуль (рекомендуется):

    # Вместо просто: uvicorn app.main:app --reload
    # Используйте:
    python -m uvicorn app.main:app --reload

    Это гарантирует использование правильного интерпретатора Python.

  5. Если пакеты не установлены, установите их:

    # Обновите pip
    python -m pip install --upgrade pip
    
    # Установите зависимости
    pip install -r requirements.txt
  6. Проверка установки (обратите внимание на регистр):

    # Windows - ищите с учетом регистра
    pip list | findstr /i sqlalchemy
    
    # Или просто посмотрите весь список
    pip list

    Должна быть строка SQLAlchemy 2.0.23 (с заглавными буквами).

  7. Если проблема сохраняется, пересоздайте виртуальное окружение:

    # Удалите старое окружение
    # Windows
    rmdir /s venv
    # Linux/Mac
    rm -rf venv
    
    # Создайте новое
    python -m venv venv
    
    # Активируйте
    # Windows
    venv\Scripts\activate
    # Linux/Mac
    source venv/bin/activate
    
    # Установите зависимости
    pip install -r requirements.txt
    
    # Запустите сервер
    python -m uvicorn app.main:app --reload

Проблема: Ошибка миграций

Решение:

# Откатить все миграции
alembic downgrade base

# Применить заново
alembic upgrade head

Проблема: "Invalid authentication credentials"

Решение:

  • Проверьте, что токен передается в заголовке Authorization: Bearer TOKEN
  • Убедитесь, что токен не истек (access token живет 30 минут)
  • Обновите токен через /auth/refresh

Проблема: "Only verified authors can perform this action"

Решение:

  • Пользователь должен иметь is_verified_author = true
  • Установите через SQL:
    UPDATE users SET is_verified_author = true WHERE email = 'user@example.com';

Проблема: Порт 8000 уже занят

Решение:

# Использовать другой порт
uvicorn app.main:app --reload --port 8001

Структура проекта

lab2_Ponomarenko_P_P/
├── alembic/                 # Миграции базы данных
│   ├── versions/
│   └── env.py
├── app/
│   ├── api/
│   │   └── v1/
│   │       ├── endpoints/   # Endpoints API
│   │       │   ├── auth.py  # Авторизация
│   │       │   ├── users.py
│   │       │   ├── news.py
│   │       │   └── comments.py
│   │       └── api.py
│   ├── core/
│   │   ├── config.py        # Настройки
│   │   ├── database.py      # Подключение к БД
│   │   ├── dependencies.py  # Зависимости для авторизации
│   │   └── security.py      # JWT и хеширование
│   ├── models/              # SQLAlchemy модели
│   │   ├── user.py
│   │   ├── news.py
│   │   ├── comment.py
│   │   └── refresh_session.py
│   └── main.py              # Точка входа
├── docs/
│   └── auth.md              # Документация по авторизации
├── .env                     # Переменные окружения (создать)
├── requirements.txt         # Зависимости
└── README.md                # Этот файл

Дополнительная документация

Лицензия

Этот проект создан в учебных целях.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages