Как объединить Python и HTML на веб-страницах
Способы встраивания Python в HTML
Как динамически генерировать HTML-страницы с помощью Python на сервере?
Шаблонизаторы Jinja2 и Flask
Наиболее эффективный способ интеграции Python в HTML - использование серверных шаблонизаторов. В экосистеме Python популярен Jinja2, часто применяемый вместе с микрофреймворком Flask. Python код выполняется на сервере, результаты вставляются в шаблон.
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
name = "Мир"
items = ["яблоко", "банан", "вишня"]
return render_template('index.html', name=name, items=items)
if __name__ == '__main__':
app.run()Backend python django (backend на django с python)
<!DOCTYPE html>
<html>
<head><title>Привет, {{ name }}</title></head>
<body>
<h1>Привет, {{ name }}</h1>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>веб библиотека python (веб-библиотека python (фреймворк))
Пояснение: Flask передаёт переменные name и items в шаблон. Jinja2 выполняет подстановку {{ name }} и цикл {% for %}. Результат - чистый HTML, отправленный клиенту.
Типичные ошибки: неэкранированный пользовательский ввод (XSS). Jinja2 по умолчанию экранирует {{ }}, но если нужно вывести HTML, используйте |safe. Другая проблема - перегруженная логика в шаблонах: рекомендуется выносить сложные вычисления в Python код.
Как встроить Python в HTML с помощью Django?
Django использует собственный шаблонизатор, похожий на Jinja2. Пример:
# views.py
def my_view(request):
context = {'title': 'Django', 'users': ['Alice', 'Bob']}
return render(request, 'my_template.html', context)
Html python code (встраивание python кода в html)
<!-- my_template.html -->
<h1>{{ title }}</h1>
<ul>
{% for user in users %}
<li>{{ user }}</li>
{% endfor %}
</ul>Django разработка веб приложений на python (разработка веб-приложений на django)
Отличие от Jinja2: Django шаблоны имеют собственные теги (например, {% url %}) и более строгие правила. Ошибки: забыть загрузить статические файлы через {% static %}.
Как запустить Python код непосредственно в браузере на HTML странице?
PyScript - фреймворк, позволяющий выполнять Python в браузере через WebAssembly. Устанавливать сервер не требуется. Пример:
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" />
<script defer src="https://pyscript.net/latest/pyscript.js"></script>
</head>
<body>
<py-script>
print("Привет из PyScript!")
import datetime
now = datetime.datetime.now()
print(f"Текущее время: {now}")
</py-script>
<div id="output"></div>
</body>
</html>Flask на языке python (flask на python)
Результат будет выведен в область, управляемую PyScript.
Проблемы: PyScript загружает интерпретатор Python (~10 МБ), что замедляет загрузку. Не все библиотеки Python доступны (например, NumPy работает, но не все функции). Ошибки: некорректный путь к скриптам, проблемы с CORS.
Как использовать CGI для встраивания Python в HTML?
CGI (Common Gateway Interface) - старый метод, при котором веб-сервер запускает скрипт Python для каждого запроса. Пример:
#!/usr/bin/env python3
print("Content-Type: text/html\n")
print("<html><body>")
print("<h1>Привет от CGI</h1>")
print("</body></html>")Fast api python (fastapi для python)
Скрипт должен быть помещён в каталог cgi-bin с правами на выполнение.
Недостатки: низкая производительность, нет разделения логики и представления, уязвимости безопасности (выполнение произвольных команд). Современные проекты почти не используют CGI.
Как генерировать HTML из Python без шаблонизатора?
Можно формировать HTML строки непосредственно в коде с помощью f-строк или конкатенации. Пример:
name = "Анна"
items = ["книга", "ручка"]
html = f"<h1>Привет, {name}</h1><ul>"
for item in items:
html += f"<li>{item}</li>"
html += "</ul>"
print(html)
Этот подход прост, но плохо масштабируется и смешивает представление с логикой.
Проблемы: сложность поддержки, уязвимость к XSS при вставке пользовательских данных (нужно экранировать вручную).
Расширенные примеры встраивания Python в HTML
Пример 1: Наследование шаблонов в Jinja2 и Flask
Создадим базовый шаблон base.html с общим оформлением:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Мой сайт{% endblock %}</title>
</head>
<body>
<header>Шапка сайта</header>
<main>
{% block content %}{% endblock %}
</main>
<footer>Подвал</footer>
</body>
</html>
Дочерний шаблон page.html:
{% extends "base.html" %}
{% block title %}Главная страница{% endblock %}
{% block content %}
<h1>Добро пожаловать, {{ name }}!</h1>
<p>Сегодня {{ date }}</p>
{% macro render_list(items) %}
<ul>
{% for i in items %}
<li>{{ i | upper }}</li>
{% endfor %}
</ul>
{% endmacro %}
{{ render_list(products) }}
{% endblock %}
Python код:
from flask import Flask, render_template
from datetime import datetime
app = Flask(__name__)
@app.route('/')
def home():
return render_template('page.html',
name='Алексей',
date=datetime.now().strftime('%d.%m.%Y'),
products=['ноутбук', 'мышь', 'клавиатура'])
app.run()
Результат (сгенерированный HTML):
<!DOCTYPE html>
<html>
<head>
<title>Главная страница</title>
</head>
<body>
<header>Шапка сайта</header>
<main>
<h1>Добро пожаловать, Алексей!</h1>
<p>Сегодня 05.04.2025</p>
<ul>
<li>НОУТБУК</li>
<li>МЫШЬ</li>
<li>КЛАВИАТУРА</li>
</ul>
</main>
<footer>Подвал</footer>
</body>
</html>
Пример 2: Интерактивный калькулятор с PyScript
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" />
<script defer src="https://pyscript.net/latest/pyscript.js"></script>
</head>
<body>
<input type="number" id="a" value="10">
<input type="number" id="b" value="5">
<button py-click="calculate()">Сложить</button>
<div id="result"></div>
<py-script>
from js import document
def calculate():
a = float(document.getElementById('a').value)
b = float(document.getElementById('b').value)
result = a + b
document.getElementById('result').innerHTML = f"Результат: {result}"
</py-script>
</body>
</html>
При нажатии кнопки выполняется Python функция, которая читает значения из полей ввода и выводит сумму. PyScript обеспечивает взаимодействие с DOM через from js import document.
Результат (после нажатия кнопки):
Результат: 15