Пост

Python для бэкенда: разработка серверных приложений

Подробное руководство по разработке бэкенда на Python. Изучите фреймворки Django, Flask и FastAPI, работу с базами данных и создание REST API. Практические примеры и лучшие практики.

Python для бэкенда: разработка серверных приложений

Введение

Python - один из самых популярных языков для разработки серверных приложений. В этой статье мы рассмотрим основы бэкенд-разработки на Python и его основные фреймворки.

Почему Python для бэкенда?

  • Простота: Чистый и понятный синтаксис
  • Богатая экосистема: Множество готовых библиотек
  • Универсальность: От простых скриптов до сложных систем
  • Большое сообщество: Активная поддержка и документация

Основы Python для бэкенда

1. Установка и настройка

Установка Python

1
2
3
4
5
6
7
# Windows: скачайте установщик с python.org
# Linux
sudo apt-get update
sudo apt-get install python3 python3-pip

# macOS
brew install python3

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

1
2
3
4
5
6
7
8
# Создание виртуального окружения
python -m venv venv

# Активация
# Windows
venv\Scripts\activate
# Linux/macOS
source venv/bin/activate

2. Основные концепции

Работа с модулями

1
2
3
4
5
6
7
8
9
10
11
12
# math.py
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

# main.py
from math import add, subtract

result = add(5, 3)
print(result)  # 8

Асинхронное программирование

1
2
3
4
5
6
7
8
9
10
11
12
import asyncio

async def fetch_data():
    # Имитация запроса к API
    await asyncio.sleep(1)
    return {"data": "some data"}

async def main():
    result = await fetch_data()
    print(result)

asyncio.run(main())

Фреймворки

1. Django

Установка и настройка

1
2
3
4
pip install django
django-admin startproject myproject
cd myproject
python manage.py startapp myapp

Создание модели

1
2
3
4
5
6
7
8
9
10
# models.py
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField(unique=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

Создание API

1
2
3
4
5
6
7
8
# views.py
from rest_framework import viewsets
from .models import User
from .serializers import UserSerializer

class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

2. Flask

Установка и настройка

1
pip install flask

Создание приложения

1
2
3
4
5
6
7
8
9
10
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/')
def hello():
    return jsonify({"message": "Hello, World!"})

if __name__ == '__main__':
    app.run(debug=True)

Работа с маршрутами

1
2
3
4
5
6
7
@app.route('/users', methods=['GET'])
def get_users():
    return jsonify({"users": []})

@app.route('/users', methods=['POST'])
def create_user():
    return jsonify({"message": "User created"}), 201

3. FastAPI

Установка и настройка

1
pip install fastapi uvicorn

Создание API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    name: str
    email: str

@app.get("/")
async def root():
    return {"message": "Hello World"}

@app.post("/users/")
async def create_user(user: User):
    return user

Работа с базами данных

1. SQLAlchemy

Установка и настройка

1
pip install sqlalchemy psycopg2-binary

Создание модели

1
2
3
4
5
6
7
8
9
10
11
12
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    
    id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String, unique=True)

2. Alembic для миграций

Настройка миграций

1
2
pip install alembic
alembic init alembic

Создание миграции

1
2
alembic revision --autogenerate -m "Create users table"
alembic upgrade head

Аутентификация и авторизация

1. JWT

Установка и использование

1
pip install python-jose[cryptography] passlib[bcrypt]
1
2
3
4
5
6
7
8
9
from jose import JWTError, jwt
from datetime import datetime, timedelta

def create_access_token(data: dict):
    to_encode = data.copy()
    expire = datetime.utcnow() + timedelta(minutes=15)
    to_encode.update({"exp": expire})
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    return encoded_jwt

2. OAuth2

Настройка OAuth2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from fastapi.security import OAuth2PasswordBearer

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

async def get_current_user(token: str = Depends(oauth2_scheme)):
    credentials_exception = HTTPException(
        status_code=status.HTTP_401_UNAUTHORIZED,
        detail="Could not validate credentials",
        headers={"WWW-Authenticate": "Bearer"},
    )
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username: str = payload.get("sub")
        if username is None:
            raise credentials_exception
    except JWTError:
        raise credentials_exception
    return username

Тестирование

1. pytest

Установка и настройка

1
pip install pytest

Создание тестов

1
2
3
4
5
# test_app.py
def test_create_user():
    response = client.post("/users/", json={"name": "John", "email": "john@example.com"})
    assert response.status_code == 201
    assert response.json()["name"] == "John"

2. Тестирование API

Тестирование с помощью requests

1
2
3
4
5
6
import requests

def test_get_users():
    response = requests.get("http://localhost:8000/users/")
    assert response.status_code == 200
    assert isinstance(response.json(), list)

Развертывание

1. Gunicorn

Установка и настройка

1
2
pip install gunicorn
gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker

2. Docker

Создание Dockerfile

1
2
3
4
5
6
FROM python:3.9
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "main:app", "--workers", "4", "--worker-class", "uvicorn.workers.UvicornWorker"]

Мониторинг

1. Логирование

Настройка логов

1
2
3
4
5
6
7
8
9
10
11
12
import logging

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)

@app.get("/")
async def root():
    logger.info("Root endpoint accessed")
    return {"message": "Hello World"}

2. Метрики

Prometheus и Grafana

1
2
3
4
5
6
7
8
9
10
11
12
from prometheus_client import Counter, Histogram

http_requests_total = Counter('http_requests_total', 'Total HTTP requests')
http_request_duration = Histogram('http_request_duration_seconds', 'HTTP request duration')

@app.middleware("http")
async def add_metrics(request, call_next):
    http_requests_total.inc()
    start_time = time.time()
    response = await call_next(request)
    http_request_duration.observe(time.time() - start_time)
    return response

Заключение

Python предоставляет мощные инструменты для разработки серверных приложений. Выберите подходящий фреймворк, следуйте лучшим практикам и постоянно улучшайте свои навыки.

Полезные ресурсы

Авторский пост защищен лицензией CC BY 4.0 .

© Oleg Dobrynin. Некоторые права защищены.