Практические задачи веб-разработки на Python
Наиболее эффективное решение: Flask
Как создать минимальное веб-приложение на Python с помощью Flask?
Flask является микрофреймворком, который позволяет быстро развернуть веб-приложение. Для начала работы требуется установка Python и pip.
Шаг 1: Создание виртуального окружения и установка Flask.
python -m venv venv
source venv/bin/activate # для Linux/macOS
# или venv\Scripts\activate для Windows
pip install flaskпрограмма python сайт (веб-программа на python)
Шаг 2: Создание файла app.py.
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return 'Привет, мир!
'
if __name__ == '__main__':
app.run(debug=True)
Шаг 3: Создание папки templates и файла index.html для использования шаблонов (по желанию).
<!DOCTYPE html>
<html>
<head><title>Мой сайт</title></head>
<body>
<h1>Добро пожаловать!</h1>
<p>Сегодня {{ date }}</p>
</body>
</html>
Обновлённый app.py с шаблоном:
from flask import Flask, render_template
from datetime import datetime
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html', date=datetime.now().strftime('%Y-%m-%d'))
if __name__ == '__main__':
app.run()
Шаг 4: Запуск приложения.
python app.py
После запуска приложение будет доступно по адресу http://127.0.0.1:5000.
Типичные ошибки и их решения
- Ошибка импорта Flask: Если появляется "ModuleNotFoundError: No module named 'flask'", значит Flask не установлен или виртуальное окружение не активировано. Необходимо проверить активацию окружения и выполнить pip install flask.
- Порт уже используется: Ошибка "Address already in use" означает, что порт 5000 занят. Можно изменить порт: app.run(port=8000) или завершить процесс, занимающий порт.
- Шаблоны не найдены: Ошибка "jinja2.exceptions.TemplateNotFound". Нужно убедиться, что файл index.html находится в папке templates внутри каталога проекта.
Цели использования: Flask подходит для создания небольших и средних веб-приложений, REST API, прототипов. Он прост в изучении и гибок.
Как сделать простой веб-сервер на Python без установки сторонних библиотек?
Встроенный модуль http.server позволяет быстро запустить сервер для раздачи статических файлов или обработки запросов с помощью CGI.
Пример простого сервера, который отдаёт статику из текущей папки:
python -m http.server 8000
Для динамических ответов можно использовать класс BaseHTTPRequestHandler:
from http.server import HTTPServer, BaseHTTPRequestHandler
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(b'Hello from custom server
')
server = HTTPServer(('localhost', 8000), MyHandler)
server.serve_forever()
Ограничения: такой сервер не поддерживает маршрутизацию, сессии, шаблоны. Подходит только для простейших задач или обучения.
Случаи использования: быстрый просмотр статического контента, создание прототипа без зависимостей.
Как создать веб-приложение на Django для сайта с несколькими страницами и базой данных?
Django - полноценный фреймворк с ORM, админкой и системой маршрутизации. Подходит для крупных проектов.
Пример создания минимального проекта:
pip install django
django-admin startproject mysite
cd mysite
python manage.py startapp main
# в файле main/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse('Главная страница')
# в mysite/urls.py добавить путь
from django.urls import path, include
urlpatterns = [
path('', include('main.urls')),
]
# создать main/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
# запуск
python manage.py runserver
Проблемы: Django требует более глубокого изучения, настройка базы данных (по умолчанию SQLite), миграции. Для простых страниц может быть избыточен.
Случаи использования: сложные веб-сайты с базами данных, администрированием, аутентификацией.
Как создать высокопроизводительное веб-приложение с автоматической документацией API?
FastAPI использует асинхронность и современные возможности Python. Он автоматически генерирует документацию OpenAPI.
Пример:
pip install fastapi uvicorn
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get('/')
def read_root():
return {'message': 'Hello World'}
@app.get('/items/{item_id}')
def read_item(item_id: int, q: str = None):
return {'item_id': item_id, 'q': q}
# запуск
uvicorn main:app --reload
Результат: документация доступна по адресу http://127.0.0.1:8000/docs.
Проблемы: необходимо понимание асинхронного программирования. Для небольших проектов может быть излишним.
Случаи использования: создание REST API с высокой производительностью, микросервисы, проекты с большим количеством одновременных запросов.
Пример 1: Flask с формой и сессией
Расширенный пример, показывающий обработку POST-запроса и использование сессий для хранения данных.
from flask import Flask, render_template, request, session, redirect, url_for
app = Flask(__name__)
app.secret_key = 'supersecretkey'
@app.route('/')
def index():
username = session.get('username')
return render_template('index.html', username=username)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return render_template('login.html')
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('index'))
if __name__ == '__main__':
app.run()
Шаблон login.html:
<form method="post">
<input type="text" name="username" placeholder="Имя">
<input type="submit" value="Войти">
</form>
Шаблон index.html:
<!DOCTYPE html>
<html>
<head><title>Flask Session</title></head>
<body>
{% if username %}
<p>Привет, {{ username }}!</p>
<a href="{{ url_for('logout') }}">Выйти</a>
{% else %}
<h1>Добро пожаловать</h1>
<a href="{{ url_for('login') }}">Войти</a>
{% endif %}
</body>
</html>
Результат: при входе по адресу /login отображается форма, после отправки – перенаправление на главную с именем, зафиксированным в сессии. При нажатии на "Выйти" сессия очищается.
Пример 2: FastAPI с Pydantic моделью и документацией
Создание API для управления списком задач.
from fastapi import FastAPI
from pydantic import BaseModel
from typing import List
app = FastAPI()
class Task(BaseModel):
id: int
title: str
done: bool = False
tasks = []
@app.get('/tasks', response_model=List[Task])
def get_tasks():
return tasks
@app.post('/tasks', response_model=Task)
def create_task(task: Task):
tasks.append(task)
return task
@app.get('/tasks/{task_id}')
def get_task(task_id: int):
for task in tasks:
if task.id == task_id:
return task
return {'error': 'Task not found'}
Запуск: uvicorn main:app --reload
После запуска документация доступна по адресу /docs. Результат выполнения запроса через curl:
$ curl -X POST http://localhost:8000/tasks -H "Content-Type: application/json" -d '{"id":1,"title":"Купить молоко"}'
{"id":1,"title":"Купить молоко","done":false}
$ curl http://localhost:8000/tasks
[{"id":1,"title":"Купить молоко","done":false}]
Пример 3: REST API на Flask с JSON
Простой API для заметок.
from flask import Flask, jsonify, request
app = Flask(__name__)
notes = []
@app.route('/notes', methods=['GET'])
def get_notes():
return jsonify(notes)
@app.route('/notes', methods=['POST'])
def add_note():
data = request.get_json()
note = {'id': len(notes)+1, 'text': data['text']}
notes.append(note)
return jsonify(note), 201
@app.route('/notes/', methods=['DELETE'])
def delete_note(note_id):
global notes
notes = [note for note in notes if note['id'] != note_id]
return '', 204
if __name__ == '__main__':
app.run()
Результат:
$ curl http://localhost:5000/notes
[]
$ curl -X POST http://localhost:5000/notes -H "Content-Type: application/json" -d '{"text":"Заметка 1"}'
{"id":1,"text":"Заметка 1"}
$ curl -X DELETE http://localhost:5000/notes/1
(нет вывода, статус 204)
Пример 4: Развёртывание Flask с Gunicorn
Для продакшн-среды рекомендуется использовать Gunicorn (на Linux).
# Установка
pip install gunicorn
# Запуск приложения из файла app.py
gunicorn -w 4 -b 0.0.0.0:8000 app:app
Параметр -w задаёт количество рабочих процессов, -b – адрес и порт. После запуска приложение будет доступно на порту 8000. Gunicorn работает только на Unix-подобных системах; на Windows можно использовать waitress.