Практические задачи веб-разработки на 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.

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

En
программа python сайт (python)