Создание веб-приложений на Python: выбираем библиотеку

Раздел: Библиотеки -> Веб

Веб-программирование на Python предлагает множество библиотек и фреймворков, каждый из которых решает определённые задачи. В этой статье рассматриваются популярные варианты, начиная с лёгкого web.py, продолжая микрофреймворком Flask, полнофункциональным Django и асинхронным FastAPI. Основное внимание уделяется библиотеке web.py, как простому и эффективному решению для быстрого старта.

Обзор библиотек для веб-программирования на Python

Как создать минимальное веб-приложение на Python с помощью web.py?

web.py – лёгкий фреймворк от Аарона Шварца, не требующий сложной настройки. Его цель – минимизировать код для базового приложения. Чаще всего применяется для прототипов и маленьких сервисов.

import web

urls = (
    '/', 'index',
    '/hello/(.*)', 'hello'
)
app = web.application(urls, globals())

class index:
    def GET(self):
        return "Главная страница"

class hello:
    def GET(self, name):
        return f"Привет, {name}!"

if __name__ == "__main__":
    app.run()

Python web py (веб-программирование на python)

После запуска сервера (по умолчанию на порту 8080) переход по адресу http://localhost:8080/ выводит Главная страница, а http://localhost:8080/hello/МирПривет, Мир!. Каждый URL сопоставляется с классом, метод GET обрабатывает GET-запросы.

Типичная ошибка: импорт web не удаётся, если библиотека не установлена. Решение: выполнить pip install web.py в терминале. Другая проблема – конфликт порта, когда другой процесс уже использует 8080. В таком случае запустить app.run(port=8000).

Как использовать Flask для быстрого прототипирования?

Flask – микрофреймворк с широкой поддержкой расширений. Подходит для проектов, где нужна гибкость и простота. Пример приложения с маршрутизацией и шаблонами.

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/')
def index():
    return 'Flask работает'

@app.route('/user/<username>')
def user(username):
    return f'Профиль пользователя {username}'

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

Запуск с debug=True перезагружает сервер при изменении кода. Шаблоны создаются в папке templates.

Проблема: ошибка импорта модуля flask. Решение: pip install flask. Если при запуске указанный порт занят, app.run(port=5001) меняет порт.

Как организовать структуру большого проекта с Django?

Django – полновесный фреймворк «всё включено»: ORM, админка, формы. Целесообразен для сложных веб-приложений. Пример создания приложения myapp внутри проекта.

# Команды в терминале:
# django-admin startproject mysite
# cd mysite
# python manage.py startapp myapp

# myapp/views.py
from django.shortcuts import render
from django.http import HttpResponse

def home(request):
    return HttpResponse("Django приветствует вас")

После настройки URL в mysite/urls.py и запуска python manage.py runserver приложение становится доступно. Django автоматически управляет миграциями базы данных.

Типичная ошибка: не применены миграции – python manage.py migrate. Если не создать суперпользователя, админка недоступна. python manage.py createsuperuser решает проблему.

Как достичь высокой производительности с FastAPI?

FastAPI – асинхронный фреймворк, использующий Python 3.7+ и стандартные аннотации типов. Подходит для API, где требуется скорость и документация OpenAPI. Пример простого эндпоинта.

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "FastAPI работает"}

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

Запуск через uvicorn main:app --reload. По адресу /docs автоматически генерируется Swagger-документация.

Ошибка: не установлен uvicorn. Решение: pip install uvicorn. Если параметры типов не совпадают, FastAPI выбрасывает ошибку валидации – нужно проверить аннотации.

Расширенные примеры для углублённого изучения веб-программирования на Python с использованием web.py.

Продвинутые сценарии работы с web.py

Как обрабатывать формы и сохранять данные в web.py?

Ниже приведён пример приложения с формой ввода имени и возраста, данные сохраняются в текстовый файл.

Пример
import web

urls = (
    '/', 'index',
    '/submit', 'submit'
)
app = web.application(urls, globals())
render = web.template.render('templates/')

class index:
    def GET(self):
        return render.form()

class submit:
    def POST(self):
        i = web.input(name=None, age=None)
        if i.name and i.age:
            with open('users.txt', 'a') as f:
                f.write(f"{i.name},{i.age}\n")
            return f"Сохранено: {i.name}, {i.age} лет"
        else:
            return "Заполните все поля"

if __name__ == "__main__":
    app.run()

Для работы требуется шаблон templates/form.html:

Пример
<form method="POST" action="/submit">
    Имя: <input type="text" name="name"><br>
    Возраст: <input type="number" name="age"><br>
    <input type="submit" value="Отправить">
</form>

Результат: после заполнения и отправки формы в корневой папке создаётся файл users.txt с записями вида Иван,25. Если поля пустые, выводится предупреждение.

При отправке формы с именем "Анна" и возрастом 30:
Сохранено: Анна, 30 лет
Частая проблема: шаблоны не найдены. Решение: создать папку templates в той же директории, что и скрипт. Ошибка синтаксиса в шаблоне – проверить корректность HTML.

Как подключить базу данных SQLite в web.py?

web.py имеет встроенную поддержку баз данных. Пример с SQLite, демонстрирующий создание таблицы и вставку записей.

Пример
import web

# Настройка подключения к SQLite
db = web.database(dbn='sqlite', db='mydb.db')

# Создание таблицы (если не существует)
def init_db():
    db.query("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)")

urls = (
    '/add', 'add',
    '/list', 'list'
)
app = web.application(urls, globals())

class add:
    def GET(self):
        # Пример вставки
        db.insert('users', name='Алексей', email='alex@example.com')
        return "Пользователь добавлен"

class list:
    def GET(self):
        users = db.select('users')
        result = "<ul>"
        for u in users:
            result += f"<li>{u.id}: {u.name} - {u.email}</li>"
        result += "</ul>"
        return result

if __name__ == "__main__":
    init_db()
    app.run()

Запуск: перейти на /add – пользователь добавляется, на /list – показываются все записи. База данных создаётся автоматически в файле mydb.db.

После двух переходов на /add, /list выведет:
<ul>
<li>1: Алексей - alex@example.com</li>
<li>2: Алексей - alex@example.com</li>
</ul>
Ошибка: web.database не импортируется, если не установлен драйвер SQLite (встроен в Python). Но для других баз (MySQL, PostgreSQL) требуется дополнительный пакет. При повторном запуске данные сохраняются, так как файл остаётся.

Как реализовать RESTful API с возвратом JSON в web.py?

web.py позволяет легко отдавать JSON, задавая заголовок ответа. Пример API, возвращающего список книг.

Пример
import web
import json

urls = (
    '/api/books', 'books',
    '/api/books/(\d+)', 'book'
)
app = web.application(urls, globals())

# Имитация базы данных
books = [
    {"id": 1, "title": "Война и мир", "author": "Толстой"},
    {"id": 2, "title": "Преступление и наказание", "author": "Достоевский"}
]

class books:
    def GET(self):
        web.header('Content-Type', 'application/json')
        return json.dumps(books, ensure_ascii=False)

class book:
    def GET(self, book_id):
        web.header('Content-Type', 'application/json')
        for b in books:
            if b['id'] == int(book_id):
                return json.dumps(b, ensure_ascii=False)
        return json.dumps({"error": "Книга не найдена"}, ensure_ascii=False)

if __name__ == "__main__":
    app.run()

При запросе /api/books возвращается массив книг в формате JSON. Запрос /api/books/1 возвращает первую книгу. Использование ensure_ascii=False сохраняет кириллицу.

GET /api/books:
[{"id": 1, "title": "Война и мир", "author": "Толстой"}, {"id": 2, "title": "Преступление и наказание", "author": "Достоевский"}]

GET /api/books/2:
{"id": 2, "title": "Преступление и наказание", "author": "Достоевский"}
Проблема: если не установить Content-Type, браузер может отобразить JSON как текст. Решение: всегда устанавливать заголовок. Ошибка при невалидном book_id – проверка на целое число через int() может вызвать исключение; используйте web.input() или обработку try/except.

Веб-программирование на Python - comments

En
Python web py (python)