CGI: пишем простой сайт на Python. Часть 1: Hello world
Проще всего создать динамические страницы на Python при помощи CGI-скриптов. CGI-скрипты — это исполняемые файлы, которые выполняются веб-сервером, когда в URL запрашивается соответствующий скрипт.
Сегодня я расскажу про то, как написать Hello world, как CGI-скрипт.
Настройка локального сервера
В Python уже есть встроенный CGI сервер, поэтому его настройка элементарна.
Для запуска из консоли (для любителей linux-систем). Запускать нужно из той папки, где мы хотим работать:
python3 -m http.server --cgi
Для сидящих на Windows чуть проще будет запуск Python файла (заметьте, что он должен находиться в той же папке, в которой мы планируем работать!):
Теперь откройте браузер и в адресной строке наберите localhost:8000
Если у вас примерно такая же картина, значит, у вас все заработало!
Hello world
Теперь в той папке, где мы запустили сервер, создаём папку cgi-bin (у меня она уже создана).
В этой папке создаём скрипт hello.py со следующим содержимым:
"Первая строка говорит о том, что это Python скрипт (CGI-скрипты можно не только на Python писать).
Вторая строка печатает заголовок. Он обозначает, что это будет html файл (бывает ещё css, javascript, pdf и куча других, и браузер различает их по заголовкам).
Третья строка (просто символ новой строки) отделяет заголовки от тела ответа.
Четвёртая печатает Hello world.
Теперь переходим на localhost:8000/cgi-bin/hello.py
Если у вас не работает, проверьте, установлены ли права на выполнение.
Также в консоли запущенного сервера появляются сообщения об ошибках. Например, убрал скобочку и обновил страницу:
В следующей части мы рассмотрим обработку данных форм и cookies.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Подключение внешних ресурсов и работа с формами
Это занятие начнем с рассмотрения способа подключения внешних ресурсов к шаблону HTML-документа. Наверное, многие из вас знают, что полноценные страницы сайта представляются не только файлом HTML с набором тегов, но и, например, каскадными таблицами стилей (CSS), JavaScript-программами, которые исполняются в браузере клиента и другими дополнительными внешними ресурсами.

И здесь возникает вопрос: где расположить эти вспомогательные файлы, которые, как правило, являются общими для всех страниц сайта, и как прописать к ним путь в шаблоне HTML-страницы. Для этого, как раз хорошо подходит функция
о которой мы говорили на предыдущем занятии. Ее также можно вызывать непосредственно в шаблоне и она будет связана с текущим контекстом запроса, по которому берется шаблон. То есть, функция url_for корректно отработает и корректно возвратит запрашиваемый URL-адрес. Но что следует прописать первым аргументом у этой функции. Как мы говорили, там должно фигурировать имя функции-обработчика. Но здесь же нам нужен не обработчик а путь к внешнему файлу. Для этого во Flask для url_for зарезервировано специальный параметр
который означает, что нужно обратиться к подкаталогу 'static' и там взять файл, указанный в именованном параметре
Давайте подключим оформление к страницам сайта в шаблоне base.html, используя эту функцию:
link type="text/css" href=">" rel="stylesheet" />
В данном случае функция url_for возвратит путь:
и в шаблон будет подключен этот файл оформления страницы. Содержимое этого файла следующее (см. видео). Я не буду здесь подробно объяснять как работают эти стили, если вы не знакомы с CSS, то посмотрите это занятие.
Обновим страницу, увидим следующий результат:

Чтобы таблицы стилей были применены к соответствующим элементам HTML-документа, добавим следующие строчки (в base.html):
ul class="mainmenu"> … /ul> div class="clear">/div> div class="content"> … /div>
Теперь, при обновлении увидим такую страницу:

Далее, добавим ссылки нашим пунктам меню:
li>a href=">">{{m.name}}/a>/li>
А само меню в программе представим в виде списка словарей:
menu = [{"name": "Установка", "url": "install-flask"}, {"name": "Первое приложение", "url": "first-app"}, {"name": "Обратная связь", "url": "contact"}]
Теперь при обновлении страницы мы увидим полноценное меню.
Аналогичным образом можно подключать и другие внешние файлы.
Работа с формой (form)
Теперь, когда мы с вами разобрались как конструировать шаблоны страниц, пришло время познакомиться с обработкой form, которые есть практически в любом сайте. Что такое формы, я думаю, вы прекрасно знаете, например, очень часто можно встретить формы авторизации и регистрации:

- GET – в виде строки запроса: "/handler?name=Alex&old=18&profit=1000";
- POST – в виде бинарных данных (используется для передачи больших объемов данных: изображений, звуков, документов и т.п., а также закрытых сведений: паролей, логинов и т.п.).
{% extends 'base.html' %} {% block content %} {{ super() }} form action="/contact" method="post" class="form-contact"> p>label>Имя: /label> input type="text" name="username" value="" requied /> p>label>Email: /label> input type="text" name="email" value="" requied /> p>label>Сообщение:/label> p>textarea name="message" rows=7 cols=40>/textarea> p>input type="submit" value="Отправить" /> /form> {% endblock %}
Мы здесь указали способ отправки данных в виде POST-запроса и обработчик «/contact», которому будут переданы данные из формы. Далее, пропишем следующее оформление формы (в файле styles.css):
.form-contact label { display: inline-block; min-width: 80px; } .form-contact p {margin: 10px 0 10px 0;} .form-contact input[type=submit], textarea { font-size: 16px; }

Запустим программу, откроем в браузере страницу http://127.0.0.1:5000/contact и увидим следующий результат: Если сейчас ввести в форму какие-либо данные и нажать на кнопку отправить, то сервер возвратит ошибку: 405 – запрет на прием данных (Method Not Allowed) Дело в том, что в обработчике мы должны явно указать: может ли он принимать данные методом POST. Для этого нужно прописать параметр methods со значением POST как элемент списка:
@app.route("/contact", methods=["POST"])
Или так, если хотим обрабатывать и POST и GET запросы:
@app.route("/contact", methods=["POST", "GET"])
Далее в обработчике проверим: пришел ли именно POST-запрос, а не какой-либо другой и выведем данные в консоль:
if request.method == 'POST': print(request.form)
А вначале импортируем этот объект:
from flask import Flask, render_template, request
Мы здесь используем объект request, который связан с данными текущего запроса и существует в пределах контекста запроса, как мы это отмечали на предыдущих занятиях. Далее, все данные формы доступны по свойству form, которое представляет своеобразный словарь, то есть, для доступа к конкретному полю можно использовать следующую запись:
print(request.form['username'])
Мы пока не будем нигде сохранять принятые данные, т.к. для этого следует использовать БД, о которой еще ничего не говорили. Главное, на этом этапе понимать, как происходит прием данных от формы и их представление в объекте request. На этом завершим это занятие. На следующем продолжим изучать функционал работы с формами.
Как можно подключить скрипт python к html
Не получается подключить скрипт питона к html через brython, в чём проблема или как ещё можно подключить? html:

Отслеживать
1,771 2 2 золотых знака 5 5 серебряных знаков 17 17 бронзовых знаков
задан 5 дек 2022 в 9:48
11 3 3 бронзовых знака
5 дек 2022 в 9:49
А что, PyQt может прямо через html работать? Что-то я сомневаюсь.
5 дек 2022 в 9:53
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Вероятно, это будет зависеть от того, что вы хотите сделать. Я лично использую CGI, и может быть проще, если ваши входные данные с веб-страницы будут простыми, а обучение займет меньше времени. Вот несколько ресурсов для этого:
cgi — поддержка общего интерфейса шлюза Python — CGI-программирование Однако вам, возможно, все же придется выполнить некоторые настройки, чтобы разрешить запуск программы вместо ее отображения.
Вот учебник по этому вопросу: Учебник по Apache: Динамический контент с CGI
Отслеживать
ответ дан 5 дек 2022 в 10:01
web developer web developer
479 3 3 серебряных знака 9 9 бронзовых знаков
- python
- html
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.11.21.1314
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
PyScript - Python, встроенный в HTML
![[pyscript Pyodide python]](https://romankurnovskii.com/ru/posts/pyscript-python-embedded-in-html//images/pyscript-featured.jpg)
PyScript - средство запуска Python в браузере, встроенное в HTML, был анонсирован на мероприятии PyCon в Солт-Лейк-Сити, США.

Кнопка Instl здесь для шутки, так как установка не требуется
PyScript зависит от существующего проекта Pyodide, который является скомпилированным в WebAssembly интерпретатором CPython 3.8, позволяющим запускать Python в браузере, а также скомпилированных научных пакетов Python.
Связывание с файлами библиотеки CSS и JavaScript PyScript позволяет разработчикам встраивать код Python с помощью тега , а также компонент (Read, Evaluate, Print, Loop), который позволяет Python печатать и выполняться динамически.
PyScript является открытым исходным кодом с использованием лицензии Apache 2.0.
Согласно сайту проекта, цели включают в себя включение Python в браузере без настройки на стороне сервера, запуск популярных пакетов Python, двунаправленную связь между JavaScript и Python и визуальную разработку с использованием «легкодоступных контролируемых компонентов пользовательского интерфейса, таких как кнопки, контейнеры, текстовые поля и многое другое».
Упрощение использования в браузере порадует не только ученых, разрабатывающих аналитические приложения, но и программистов любого профиля, ищущих альтернативу JavaScript — хотя разработчики проекта предупреждают, что это «чрезвычайно экспериментальный проект» и что он только проверен в веб-браузере Google Chrome.
Please be advised that PyScript is very alpha and under heavy development. There are many known issues, from usability to loading times, and you should expect things to change often. We encourage people to play and explore with PyScript, but at this time we do not recommend using it for production.
Туториал PyScript
Попробуем скачать, настроить и запустить приложение PyScript в браузере.
Рабочая среда
Разработчики PyScript пишут, что для работы не требуется никакой среды разработки, кроме веб-браузера. Попробуем запустить в Chrome.
Установка
Можно скачать весь пакет с сайта, но будем использовать скрипт, с сервера pyscript.net
Hello World
Создаем файл hello.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('Hello, World!') py-script> body> html>
Тег расположен внутри HTML body. Внутри этого тега будем пиcать Python код.
Откроем файл в браузере

Тег py-script
Тег позволяет писать многострочный код
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("Let's compute π:") def compute_pi(n): pi = 2 for i in range(1,n): pi *= 4 * i ** 2 / (4 * i ** 2 - 1) return pi pi = compute_pi(100000) s = f"π is approximately " print(s) py-script> body> html>
Важно соблюдать отступы в самом блоке Python. Но Начальную строку кода можно начинать и с начала строки
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("Let's compute π:") def compute_pi(n): pi = 2 for i in range(1,n): pi *= 4 * i ** 2 / (4 * i ** 2 - 1) return pi pi = compute_pi(100000) s = f"π is approximately " print(s) py-script> body> html>
Запись внутри HTML элементов
В приведенном выше примере у нас был один тег , выводящий одну или несколько строк на страницу по порядку. Внутри есть доступ к модулю pyscript, который предоставляет метод .write() для отправки строк в помеченные элементы на странице.
Например, мы добавим некоторые элементы стиля и предоставим заполнители для тега для записи.
html> head> link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" /> script defer src="https://pyscript.net/latest/pyscript.js">script> link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous"> head> body> b>p>Today is u>label id='today'>label>u>p>b> br> div id="my-custom-pi" class="alert alert-primary">div> py-script> import datetime as dt pyscript.write('today', dt.date.today().strftime('%A %B %d, %Y')) def compute_pi(n): pi = 2 for i in range(1,n): pi *= 4 * i ** 2 / (4 * i ** 2 - 1) return pi pi = compute_pi(100000) pyscript.write('my-custom-pi', f'π is approximately ') py-script> body> html>

Тег py-env
В дополнение к стандартной библиотеке Python и модулю pyscript, многие сторонние пакеты работают с PyScript. Чтобы их использовать, нужно объявить зависимости с помощью тега в заголовке HTML. Вы также можете ссылаться на файлы .whl прямо на диске
py-env> - './static/wheels/travertino-0.1.3-py3-none-any.whl' - './static/wheels/my-other-package-0.0.1-py3-none-any.whl' py-env> py-script> #my python code . py-script>
Пример с NumPy
html> head> link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" /> script defer src="https://pyscript.net/latest/pyscript.js">script> py-env> - numpy - matplotlib py-env> head> body> h1>Let's plot random numbersh1> div id="plot">div> py-script output="plot"> import matplotlib.pyplot as plt import numpy as np x = np.random.randn(1000) y = np.random.randn(1000) fig, ax = plt.subplots() ax.scatter(x, y) fig py-script> body> html>
Импорт локальный модулей
Мы также можем использовать собсвтенные модули, которые импортируем внутри тега
Например, создадим файл `data.py’ и запишем в него собственную функцию
# data.py import numpy as np def make_x_and_y(n): x = np.random.randn(n) y = np.random.randn(n) return x, y
Внутри тега добавим стандартные модули и путь до нашего локального модуля
html> head> link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css" /> script defer src="https://pyscript.net/latest/pyscript.js">script> py-env> - numpy - matplotlib - paths: - /data.py py-env> head> body> h1>Let's plot random numbersh1> div id="plot">div> py-script output="plot"> import matplotlib.pyplot as plt from data import make_x_and_y x, y = make_x_and_y(n=1000) fig, ax = plt.subplots() ax.scatter(x, y) fig py-script> body> html>
Тег py-repl
Тег создает компонент REPL(Read–eval–print loop), который отображается на странице как редактор кода, что позволяет писать исполняемый код в строке.
Тег py-config
Тег используется для установки и настройки общих метаданных о вашем приложении PyScript в формате YAML.
py-config> - autoclose_loader: false - runtimes: - src: "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyodide.js" name: pyodide-0.20 lang: python py-config>
Тег py-title
Тег визуального отображения. Добавляет компонент заголовка статического текста, который стилизует текст внутри тега как заголовок страницы.
Тег py-box
Создает объект-контейнер, который можно использовать для размещения одного или нескольких визуальных компонентов, определяющих, как элементы должны выравниваться и отображаться на странице.
Тег py-inputbox
Позволяет вставить окно с текстовым полем
Тег py-button
Добавляет кнопку, к которой авторы могут добавлять метки и обработчики событий для действий на кнопке, таких как on_focus или on_click.
Ресурсы
- Примеры использования PyScript
- Вопросы по PyScript
