Пока пользователи листают ленту Instagram, смотрят рекомендации Netflix или ищут информацию через Google, за кулисами своей работы титаны цифровой эры доверяют одному и тому же языку — Python. Как язык, изначально не заточенный под веб, стал одним из главных архитекторов современного интернета?
Для нашего небольшого бизнеса нужны были стильные нашивки на форму сотрудников. Хотелось, чтобы логотип выглядел дорого, не выцветал и не отклеивался после стирок. Начали искать, где можно качественно вышить шевроны, и наткнулись на сайт «Студии вышивки Буслаев». Честно говоря, сразу понравилось, что у них есть калькулятор цен — можно было примерно прикинуть бюджет, не мучая менеджера вопросами. Заказали партию нашивок на липучках для униформы и заодно несколько вышитых логотипов на толстовки для корпоративных подарков.
Процесс оказался очень простым: отправили свой макет, дизайнеры оперативно помогли адаптировать его для вышивальной программы, согласовали цвета и плотность застила. В итоге получили то, что хотели: чёткие, объёмные, качественные нашивки. Все швы аккуратные, цвета насыщенные, крепление надёжное. Сотрудники довольны — форма стала выглядеть гораздо солиднее, а подарки получились по-настоящему тёплыми и персонализированными.
Если нужна вышивка на одежде или шевроны на заказ — рекомендую обращаться к ребятам: https://vishivka-b.ru
От CGI-скриптов до полноценных фреймворков
История Python в вебе началась скромно — с написания простых CGI-скриптов для генерации динамических HTML-страниц. Однако его элегантность и мощь быстро нашли применение в более сложных задачах.
Эволюция веб-разработки на Python:
# Ранние дни: CGI скрипты
#!/usr/bin/env python
print("Content-Type: text/html\n")
print("<html><body>")
print("<h1>Hello World from CGI!</h1>")
print("</body></html>")
# Современный подход: FastAPI
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List
app = FastAPI(title="Modern Web API")
class Item(BaseModel):
name: str
price: float
tags: List[str] = []
@app.get("/")
async def read_root():
return {"message": "Welcome to Modern Web"}
@app.post("/items/")
async def create_item(item: Item):
return {"item": item, "status": "created"}
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
Два столпа Python в вебе: Django и Flask
Заказывайте услуги фрилансеров, создавайте сайты, находите подработку на дому! Биржа фриланса Rz-Work — для новичков и профессионалов. Откройте для себя лучшую фриланс-платформу в России! https://rz-work.ru
Экосистема Python предлагает два принципиально разных подхода, покрывающих потребности практически любого проекта.
Django — полнофункциональный фреймворк:
# Пример Django приложения
from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
class BlogPost(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
return reverse('post-detail', kwargs={'pk': self.pk})
def __str__(self):
return self.title
# Django View
from django.views.generic import ListView, DetailView
from .models import BlogPost
class PostListView(ListView):
model = BlogPost
template_name = 'blog/post_list.html'
context_object_name = 'posts'
paginate_by = 10
class PostDetailView(DetailView):
model = BlogPost
template_name = 'blog/post_detail.html'
Flask — микрофреймворк с гибкостью:
from flask import Flask, render_template, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'
db = SQLAlchemy(app)
login_manager = LoginManager(app)
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
email = db.Column(db.String(120), unique=True)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/')
def index():
return render_template('index.html')
@app.route('/api/users', methods=['POST'])
def create_user():
data = request.get_json()
user = User(username=data['username'], email=data['email'])
db.session.add(user)
db.session.commit()
return jsonify({'message': 'User created'}), 201
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
FastAPI: Новый игрок, изменивший правила игры
Заказывайте услуги фрилансеров, создавайте сайты, находите подработку на дому! Биржа фриланса Rz-Work — для новичков и профессионалов. Откройте для себя лучшую фриланс-платформу в России! https://rz-work.ru
Появление FastAPI стало революцией для создания современных API.
Современный веб-сервис на FastAPI:
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from pydantic import BaseModel
from datetime import datetime, timedelta
from jose import JWTError, jwt
from passlib.context import CryptContext
from typing import Optional
app = FastAPI()
# Настройки безопасности
SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class User(BaseModel):
username: str
email: Optional[str] = None
disabled: Optional[bool] = None
class UserInDB(User):
hashed_password: str
class Token(BaseModel):
access_token: str
token_type: str
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
def get_password_hash(password):
return pwd_context.hash(password)
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
@app.post("/token", response_model=Token)
async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()):
# Аутентификация пользователя
user = authenticate_user(form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
return {"access_token": access_token, "token_type": "bearer"}
@app.get("/users/me/", response_model=User)
async def read_users_me(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
user = get_user(username)
if user is None:
raise credentials_exception
return user
Почему крупнейшие компании доверяют Python?
Instagram (крупнейший Django-проект в мире):
# Пример архитектуры похожей на Instagram
from django.db import models
from django.contrib.auth.models import User
from django.core.files.storage import FileSystemStorage
from PIL import Image
import uuid
class Post(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE)
image = models.ImageField(upload_to='posts/')
caption = models.TextField(blank=True)
created_at = models.DateTimeField(auto_now_add=True)
likes = models.ManyToManyField(User, related_name='liked_posts', blank=True)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
# Оптимизация изображения
img = Image.open(self.image.path)
if img.height > 1080 or img.width > 1080:
output_size = (1080, 1080)
img.thumbnail(output_size)
img.save(self.image.path)
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
user = models.ForeignKey(User, on_delete=models.CASCADE)
text = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
class Story(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
image = models.ImageField(upload_to='stories/')
created_at = models.DateTimeField(auto_now_add=True)
expires_at = models.DateTimeField()
def save(self, *args, **kwargs):
if not self.expires_at:
self.expires_at = timezone.now() + timezone.timedelta(hours=24)
super().save(*args, **kwargs)
Современный веб-стек на Python
Полноценное веб-приложение с современным стеком:
# backend/main.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from contextlib import asynccontextmanager
from database import engine, Base
from routers import users, posts, auth
import asyncpg
@asynccontextmanager
async def lifespan(app: FastAPI):
# Startup
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
yield
# Shutdown
await engine.dispose()
app = FastAPI(lifespan=lifespan)
# CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Роутеры
app.include_router(auth.router, prefix="/auth", tags=["auth"])
app.include_router(users.router, prefix="/users", tags=["users"])
app.include_router(posts.router, prefix="/posts", tags=["posts"])
# database.py
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import declarative_base, sessionmaker
DATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"
engine = create_async_engine(DATABASE_URL, echo=True)
AsyncSessionLocal = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
Base = declarative_base()
# routers/posts.py
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from database import AsyncSessionLocal
from models import Post, User
from schemas import PostCreate, PostResponse
from auth import get_current_user
router = APIRouter()
async def get_db():
async with AsyncSessionLocal() as session:
yield session
@router.post("/", response_model=PostResponse)
async def create_post(
post: PostCreate,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user)
):
db_post = Post(**post.dict(), user_id=current_user.id)
db.add(db_post)
await db.commit()
await db.refresh(db_post)
return db_post
@router.get("/", response_model=list[PostResponse])
async def read_posts(
skip: int = 0,
limit: int = 100,
db: AsyncSession = Depends(get_db)
):
result = await db.execute(select(Post).offset(skip).limit(limit))
posts = result.scalars().all()
return posts
Производительность и масштабирование
Python доказал, что может handle высокие нагрузки:
Оптимизация производительности:
# Использование async/await для высоких нагрузок
from fastapi import FastAPI
import asyncio
import aiohttp
from datetime import datetime
app = FastAPI()
async def fetch_data(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.json()
@app.get("/aggregate")
async def aggregate_data():
urls = [
"https://api.service1.com/data",
"https://api.service2.com/data",
"https://api.service3.com/data"
]
# Параллельные запросы
tasks = [fetch_data(url) for url in urls]
results = await asyncio.gather(*tasks, return_exceptions=True)
# Агрегация результатов
aggregated = {
"timestamp": datetime.utcnow().isoformat(),
"sources": len(urls),
"data": results
}
return aggregated
# Кэширование для улучшения производительности
from functools import lru_cache
import requests
@lru_cache(maxsize=100)
def get_cached_data(key: str):
# Дорогостоящая операция
response = requests.get(f"https://api.example.com/data/{key}")
return response.json()
# Фоновые задачи
from fastapi import BackgroundTasks
def process_large_file(file_path: str):
# Обработка в фоне
import pandas as pd
df = pd.read_csv(file_path)
# Долгая обработка...
result = df.groupby('category').mean()
result.to_csv(f"processed_{file_path}")
@app.post("/process-file/")
async def upload_file(background_tasks: BackgroundTasks, file: UploadFile):
# Сохраняем файл
with open(f"temp_{file.filename}", "wb") as f:
f.write(await file.read())
# Запускаем в фоне
background_tasks.add_task(process_large_file, f"temp_{file.filename}")
return {"message": "File processing started"}
Будущее веб-разработки на Python
Emerging trends:
- Serverless architectures — AWS Lambda, Google Cloud Functions
- Edge computing — Cloudflare Workers, Fly.io
- WebAssembly — Pyodide, WebAssembly порты
- Real-time applications — WebSockets, SSE
Пример serverless функции:
# serverless/handler.py
import json
import boto3
from mangum import Mangum
from fastapi import FastAPI
app = FastAPI()
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('users')
@app.get("/users/{user_id}")
async def get_user(user_id: str):
response = table.get_item(Key={'userId': user_id})
return response.get('Item', {})
@app.post("/users")
async def create_user(user: dict):
table.put_item(Item=user)
return {"message": "User created"}
# Оборачиваем для AWS Lambda
handler = Mangum(app)
Заключение: Невидимый, но незаменимый
Python продолжает доминировать в веб-разработке благодаря:
- Универсальности — от монолитов до микросервисов
- Производительности — современные async frameworks
- Экосистеме — богатый выбор библиотек и tools
- Сообществу — активная разработка и поддержка
Ключевые преимущества для веба:
- 🚀 Быстрая разработка — time-to-market
- 📈 Масштабируемость — от startup до enterprise
- 🔧 Гибкость — под любые requirements
- 🌐 Интеграция — с любыми системами и сервисами
Python доказал, что может быть не только языком для prototyping, но и надежной основой для самых требовательных веб-приложений. Его роль в современном интернете остается критически важной, и будущее выглядит bright с развитием новых technologies и approaches.
В мире, где digital transformation ускоряется, Python остается constant — reliable, powerful и ready для любых вызовов современного веба.
проститутки саратова



