Основные Python веб-библиотеки для разработки сайтов и API
Обзор веб-библиотек Python
Для разработки веб-приложений на языке Python существует несколько популярных решений. Рассмотрим три основных подхода: лёгкий микрофреймворк Flask, полнофункциональный фреймворк Django и современный асинхронный FastAPI. Каждый вариант подходит для определённых задач, и выбор зависит от требований проекта.
Flask - минималистичная веб-библиотека
Как запустить простой веб-сервер с одной страницей?
Flask предоставляет только самое необходимое для создания веб-приложения. Ниже приведён минимальный пример.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Привет, мир!'
if __name__ == '__main__':
app.run()Django разработка веб приложений на python (разработка веб-приложений на django)
После запуска (команда python app.py) сервер будет доступен по адресу http://127.0.0.1:5000. Flask автоматически обрабатывает GET-запросы к корневому маршруту.
Типичные ошибки:
- Ошибка импорта ModuleNotFoundError: No module named 'flask' - решение: установить Flask командой pip install flask.
- Порт 5000 уже занят - используйте другой порт, например app.run(port=8080).
- Проблемы с кодировкой при возврате не-ASCII символов - добавьте заголовок Content-Type или используйте строку с jsonify.
Цели использования:
- Быстрое прототипирование малых приложений и API.
- Микросервисы с минимальными зависимостями.
- Обучение основам веб-разработки.
Django - многофункциональный веб-фреймворк
Как создать полноценный сайт с админ-панелью и базой данных?
Django включает ORM, шаблонизатор, систему маршрутизации, аутентификацию и административный интерфейс. Для начала создадим проект.
django-admin startproject myproject
cd myproject
python manage.py runserverFast api python (fastapi для python)
По умолчанию сервер запускается на порту 8000. Для создания приложения внутри проекта выполняется команда:
python manage.py startapp myapp
веб библиотека python (веб-библиотека python (фреймворк))
Пример простого представления в myapp/views.py:
from django.http import HttpResponse
def index(request):
return HttpResponse("Привет от Django!")Flask на языке python (flask на python)
Маршрут прописывается в myapp/urls.py, а затем подключается к корневому файлу urls.py.
Распространённые проблемы:
- Ошибка django.core.exceptions.ImproperlyConfigured - проверьте настройки DATABASES в settings.py.
- Проблемы с миграциями - выполните python manage.py makemigrations и migrate.
- Конфликты статических файлов в режиме разработки - используйте django.contrib.staticfiles.
Когда выбирать Django:
- Крупные проекты с множеством связанных моделей (CRM, соцсети).
- Требуется встроенная админка для управления контентом.
- Командная разработка со стандартизированной структурой.
FastAPI - производительный асинхронный фреймворк
Как создать асинхронный API с автоматической документацией?
FastAPI основан на Starlette и Pydantic, поддерживает асинхронные обработчики и автоматически генерирует OpenAPI-схему. Пример:
from fastapi import FastAPI
app = FastAPI()
@app.get('/')
async def root():
return {'message': 'Привет от FastAPI'}
if __name__ == '__main__':
import uvicorn
uvicorn.run(app)
После запуска документация доступна по адресу http://127.0.0.1:8000/docs.
Возможные сложности:
- Ошибка RuntimeError: You must use async with - убедитесь, что все асинхронные вызовы обёрнуты в async/await.
- Проблемы с CORS - добавьте CORSMiddleware.
- Использование синхронных библиотек (например, SQLAlchemy) внутри асинхронных функций может блокировать цикл событий - применяйте run_in_executor или используйте асинхронные драйверы.
Области применения FastAPI:
- Высоконагруженные API и микросервисы с большим числом параллельных запросов.
- Проекты, где важна автоматическая валидация данных и документация.
- Интеграция с современными фронтенд-фреймворками через REST или WebSocket.
Расширенные примеры использования
Flask: работа с формами и сессиями
Пример веб-приложения с формой входа и сохранением сессии.
from flask import Flask, render_template_string, request, session, redirect, url_for
app = Flask(__name__)
app.secret_key = 'some-secret-key'
# Шаблон для формы
form_template = '''
<form method="post">
<input name="username" placeholder="Имя">
<input type="password" name="password">
<button type="submit">Войти</button>
</form>
'''
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# Логика проверки (упрощённо)
if username == 'admin' and password == 'secret':
session['user'] = username
return redirect(url_for('profile'))
return render_template_string(form_template)
@app.route('/profile')
def profile():
if 'user' in session:
return f'Привет, {session["user"]}!'
return redirect(url_for('login'))
if __name__ == '__main__':
app.run()
Результат: при GET-запросе на /login отображается форма. После ввода корректных данных (admin/secret) пользователь перенаправляется на /profile, где отображается имя.
Django: создание модели и использование шаблона
Создадим модель Article с полями заголовка и содержания, затем отобразим список статей.
# myapp/models.py
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
published = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
# myapp/views.py
from django.shortcuts import render
from .models import Article
def article_list(request):
articles = Article.objects.all().order_by('-published')
return render(request, 'articles.html', {'articles': articles})
<h1>Список статей</h1>
{% for article in articles %}
<h2>{{ article.title }}</h2>
<p>{{ article.content }}</p>
<hr>
{% endfor %}
После выполнения миграций и добавления нескольких записей через админку, откроется страница со списком.
Вывод в браузере: заголовки и содержимое всех сохранённых статей в порядке от новых к старым.
FastAPI: валидация данных с Pydantic и работа с параметрами пути
Создадим API для управления списком задач (TODO).
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List
app = FastAPI()
class Task(BaseModel):
id: int
title: str
completed: bool = False
tasks = []
@app.post('/tasks', response_model=Task)
async def create_task(task: Task):
tasks.append(task)
return task
@app.get('/tasks/{task_id}', response_model=Task)
async def get_task(task_id: int):
for t in tasks:
if t.id == task_id:
return t
raise HTTPException(status_code=404, detail='Task not found')
@app.get('/tasks', response_model=List[Task])
async def list_tasks(completed: bool = None):
if completed is None:
return tasks
return [t for t in tasks if t.completed == completed]
Запрос POST /tasks с телом {"id": 1, "title": "Изучить FastAPI"} вернёт созданную задачу. GET /tasks/1 вернёт задачу с id=1. GET /tasks?completed=false вернёт все незавершённые задачи.
FastAPI: WebSocket-подключение
from fastapi import FastAPI, WebSocket
app = FastAPI()
@app.websocket('/ws')
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f'Эхо: {data}')
После подключения через клиент WebSocket (например, JavaScript) сервер будет отправлять обратно полученное сообщение с префиксом 'Эхо:'.