Введение
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
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
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 предоставляет мощные инструменты для разработки серверных приложений. Выберите подходящий фреймворк, следуйте лучшим практикам и постоянно улучшайте свои навыки.
Полезные ресурсы