Создание веб-приложений на 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.
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-документация.
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": "Достоевский"}
web.input() или обработку try/except.