Разработка веб-проектов на Python с примерами
Основные инструменты веб-разработки на Python
Python предлагает несколько фреймворков для создания веб-приложений. Рассмотрим наиболее популярные из них с примерами кода и разбором типичных затруднений.
Как создать минимальное веб-приложение с обработкой маршрутов на Flask?
Flask - микрофреймворк, позволяющий быстро запустить сервер с поддержкой URL-маршрутизации. Для установки выполняется команда:
pip install flaskсоздание сайтов python django (создание веб-сайтов на django с использованием python)
Создаётся файл app.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Привет, мир!'
if __name__ == '__main__':
app.run(debug=True)Python web django (web-фреймворк django)
Команда запуска: python app.py. После перехода по адресу http://127.0.0.1:5000 отобразится приветствие.
Проблема: Не запускается сервер из-за занятого порта. Решение: указать другой порт, например app.run(port=8000).
Ошибка: ImportError: No module named flask. Решение: установить Flask в виртуальное окружение.
Как настроить Django проект с админ-панелью и моделями?
Django - полнофункциональный фреймворк со встроенной админкой. Установка:
pip install djangoPython web flask (web-фреймворк flask)
Создание проекта и приложения:
django-admin startproject mysite
cd mysite
python manage.py startapp blogPython web server (web-сервер на python)
В файле blog/models.py описывается модель:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
pub_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.titlePython 3 веб приложение (веб-приложение на python 3)
После регистрации модели в admin.py:
from django.contrib import admin
from .models import Post
admin.site.register(Post)Python веб сервисы (веб-сервисы на python)
Выполнение миграций:
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuserпримеры python веб (примеры веб-разработки на python)
Сервер запускается командой python manage.py runserver. Админка доступна по /admin.
Проблема: Ошибка миграции из-за несовместимости с базой данных. Решение: указать правильный движок БД в settings.py (по умолчанию SQLite).
Ошибка: 403 Forbidden при входе в админку. Решение: проверить, что CSRF-токен передан корректно.
Как реализовать асинхронный REST API на FastAPI?
FastAPI - современный асинхронный фреймворк с автоматической генерацией документации. Установка:
pip install fastapi uvicornсоздание сайта на python (создание сайта на python)
Код приложения main.py:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
@app.get('/')
async def root():
return {'message': 'Hello World'}
@app.post('/items/')
async def create_item(item: Item):
return {'item': item.dict()}Django python создание приложения (создание веб-приложения на django)
Запуск: uvicorn main:app --reload. Документация открывается по /docs.
Проблема: Отсутствует async/await в обработчиках. Решение: при использовании синхронных библиотек нужно оборачивать их в run_in_executor.
Ошибка: CORS-запросы блокируются. Решение: добавить middleware из fastapi.middleware.cors.
Как создать простой WebSocket сервер на aiohttp?
aiohttp - асинхронный HTTP-клиент/сервер, поддерживающий WebSocket. Установка:
pip install aiohttpбиблиотека django python (библиотека django для веб-разработки на python)
Сервер ws_server.py:
from aiohttp import web
async def websocket_handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
if msg.type == web.WSMsgType.TEXT:
await ws.send_str('Эхо: ' + msg.data)
elif msg.type == web.WSMsgType.CLOSE:
break
return ws
app = web.Application()
app.router.add_get('/ws', websocket_handler)
web.run_app(app, port=8080)Подключиться можно через любой WebSocket-клиент, например wscat.
Проблема: Исключение при отправке сообщения после закрытия соединения. Решение: проверять состояние ws.closed.
Ошибка: Не устанавливается соединение из-за CORS при использовании браузера. Решение: настроить заголовки в aiohttp_middleware.
Расширенные примеры кода для веб-разработки на Python
Flask: приложение с Blueprints и обработкой JSON API
Структура проекта с разделением на модули:
# app.py
from flask import Flask
from users import users_bp
from api import api_bp
app = Flask(__name__)
app.register_blueprint(users_bp, url_prefix='/users')
app.register_blueprint(api_bp, url_prefix='/api')
if __name__ == '__main__':
app.run(debug=True)
# users/__init__.py
from flask import Blueprint
users_bp = Blueprint('users', __name__)
@users_bp.route('/')
def list_users():
return {'users': ['Alice', 'Bob']}
# api/__init__.py
from flask import Blueprint, request, jsonify
api_bp = Blueprint('api', __name__)
@api_bp.route('/data', methods=['POST'])
def receive_data():
data = request.get_json()
if not data:
return jsonify({'error': 'No JSON'}), 400
return jsonify({'received': data})Результат: при запросе POST /api/data с телом {"key":"value"} возвращается {"received": {"key":"value"}}.
Также можно добавить глобальный обработчик ошибок:
@app.errorhandler(404)
def not_found(e):
return jsonify({'error': 'Not found'}), 404FastAPI: работа с WebSocket и Dependency Injection
Пример эхо-сервера через WebSocket с валидацией параметров:
from fastapi import FastAPI, WebSocket, Depends, Query
from typing import Optional
app = FastAPI()
def get_username(username: str = Query(..., description='Имя пользователя')):
return username
@app.websocket('/ws/{room_id}')
async def websocket_endpoint(websocket: WebSocket, room_id: int, username: str = Depends(get_username)):
await websocket.accept()
await websocket.send_text(f'Добро пожаловать, {username} в комнату {room_id}')
try:
while True:
data = await websocket.receive_text()
await websocket.send_text(f'Эхо: {data}')
except WebSocketDisconnect:
print(f'Пользователь {username} отключился')Результат: при подключении к ws://localhost:8000/ws/1?username=Иван сервер приветствует пользователя и повторяет отправленные сообщения.
Также можно использовать встроенную документацию (Swagger) для тестирования HTTP-эндпоинтов, что ускоряет разработку.