Перейти к содержимому

Как встроить python в html

  • автор:

Как из Python передать данные в web-шаблоны ( html-страниц)? [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме.

Закрыт 2 года назад .

День добрый! Не так давно начал изучать Python для машинного обучения. Дополнительно занимаюсь и версткой в web. Хочу Python-ом заменить php. Как Python встроить в html? Как на Python создать обмен данных с web-шаблонами ( html-страниц)?

Отслеживать
Tryd0g0lik
задан 23 дек 2021 в 0:15
Tryd0g0lik Tryd0g0lik
96 1 1 золотой знак 1 1 серебряный знак 10 10 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Краткий ответ

Никак. Ну, то есть вообще никак.

Развернутый ответ

Такое не возможно ввиду того, что сам HTML не понимает ни одного языка программирования и заставить его понимать невозможно.

HTML — это язык гиперразметки и не более. Он является не более чем структурой и «костями» сайта. Весь CSS и JS накладываются уже поверх и исполняется самим браузером в момент, как он получает ответ от сервера с голым HTML файлом, файлами стилей и т.д.

Как вы уже наверно догадались, браузер тоже не может просто вставить ваш Python код. Он не рассчитан на это. и его так же нельзя заставить понимать Python.

Тогда что же делать?

Использовать Python библиотеки и фреймворки, предназначенные для создания сайтов, которые исполнят Ваш Python код и вернут браузеру HTML с подставленными из него значениями.

Сейчас самый удобный, актуальный и подходящий для новичков фреймворк, на мой взгляд, это Django.

Он берет на себя всю заботу об интерпретации Вашего Python кода в понятный бразеру формат. Разумеется, он имеет огромное множество других возможностей, но, если Вам это интересно, Вы сможете и сами о них узнать.

Данным ответом я не пропагандирую Django, а лишь пытаюсь дать Вам понять в каком направлении лежит решение Вашей проблемы. Используйте фреймворки.

P.S. Если у Вас возник вопрос, а почему тогда PHP может вставляться в HTML, то фишка PHP заключается как раз в том, что он сам по себе и является в этом плане прямым интерпретатором для HTML и точно так же подставляет значения перед отправкой HTML файла браузеру.

PyScript — Python, встроенный в HTML

[pyscript Pyodide python]

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

Как работать с PyScript — фреймворком для фронтенда на Python

В веб-разработке Python используется в основном на бэкенде с такими фреймворками, как Django и Flask. А сегодня, к старту курса по Fullstack-разработке на Python, расскажем о PyScript, который даёт возможность запускать Python прямо в HTML.

До сих пор Python не имел такой большой поддержки на фронтенде, как другие языки, например JavaScript. Но, к счастью, разработчики Python создали несколько библиотек для поддержки своего любимого языка в браузере, например Brython.

А на конференции PyCon 2022 анонсировали фреймворк PyScript от Anaconda для использования Python в вебе с помощью стандартного HTML. Вот твит о запуске фреймворка:

Нам понадобится

Чтобы писать код по этой статье, вам понадобятся следующие инструменты и знания:

  • любимый текстовый редактор или интегрированная среда разработки;
  • знание Python;
  • знание HTML;
  • браузер (рекомендуется Google Chrome).

Что такое PyScript?

PyScript — это фронтенд-фреймворк для создания программ на Python в браузере с использованием HTML-интерфейса, а также мощи Emscripten, Pyodide, WASM и других современных веб-технологий. В соответствии со своими целями он призван дать такие возможности:

fig:

  • упрощённый и чистый API;
  • систему подключаемых и расширяемых компонентов;
  • поддержку и расширение стандартного HTML для чтения и надёжных, и своенравных компонентов с миссией «Программирование для 99% [людей]».

В последние 20 лет Python и продвинутые языки пользовательского интерфейса, такие как HTML, CSS и JavaScript, не работали вместе. В Python не было простого механизма создания привлекательных пользовательских интерфейсов для подготовки и развёртывания приложений, а на освоение современных HTML, CSS и JavaScript может уйти много времени.

С возможностью применять в Python соглашения из HTML, CSS и JavaScript решаются не только эти две проблемы, но и те, что связаны с разработкой, подготовкой к развёртыванию, собственно развёртыванием и распространением веб-приложений.

Однако PyScript не заменит JavaScript в браузере, а, скорее, даст разработчикам Python, особенно дата-сайентистам, больше гибкости и мощи.

Почему PyScript?

С PyScript язык получает последовательные правила оформления кода, простоту освоения и больше выразительности за счёт:

  • поддержки в браузере: с PyScript появляются поддержка Python и возможность размещения без серверов и конфигурации;
  • возможности взаимодействия Python и JavaScript: в программах может осуществляться двунаправленная связь между объектами и пространствами имён Python и JavaScript;
  • поддержки экосистемы: PyScript позволяет использовать популярные пакеты Python (Pandas, NumPy и др);
  • гибкости фреймворка: PyScript — гибкий фреймворк, на основе которого разработчики легко могут создавать расширяемые компоненты прямо в Python;
  • управления средой: PyScript позволяет разработчикам определять файлы и пакеты для запуска кода своей страницы;
  • разработки пользовательского интерфейса: с PyScript разработчики могут легко работать с доступными компонентами пользовательского интерфейса (кнопками, контейнерами и др.).

Начало работы с PyScript

PyScript довольно просто освоить: следуйте инструкциям на сайте или загрузите zip-архив.

В этой статье научимся использовать PyScript через сайт, связав компоненты в HTML-файле, и выведем первый Hello World в PyScript.

Создаём HTML-файл

HTML-файл нужен для отображения текста в браузере с помощью текстового редактора / интегрированной среды разработки:

      Title: PyScript  
Привязываем PyScript

После создания HTML-файла в теге нужно указать в нём ссылку на PyScript, чтобы получить доступ к интерфейсу PyScript:

Выводим в браузере

Связав PyScript с HTML-файлом, выводим Hello World с помощью тега , который позволяет запускать многострочные программы на Python и выводить результат выполнения на странице браузера. Помещаем тег внутри тега :

  print("Hello, World!") 

Весь код HTML-файла:

      Title: PyScript   print("Hello, World!")  

В браузере вы должны увидеть:

Совет: в редакторе VSCode, чтобы перезагружать страницу при обновлении HTML-файла, используйте плагин Live Server.

Другие операции с PyScript

Прикрепляем метки к элементам

В PyScript переменные из кода на Python в HTML передаются с помощью метода write из модуля pyscript, в теге . Используя атрибут id, передаём строки, отображаемые в виде обычного текста.

В методе write принимаются две переменные: значение id и переменная, которая будет предоставлена:

     

Today is

import datetime as dt pyscript.write('today', dt.date.today().strftime('%A %B %d, %Y'))

Запускаем REPL в браузере

В PyScript код Python запускается и через интерфейс. С помощью тега компонент REPL добавляется на страницу, где пишется выполняемый код:

Мы получим вывод:

Импортируем файлы, модули и библиотеки

Одно из преимуществ PyScript — его гибкость. Здесь можно импортировать локальные файлы, встроенные модули или сторонние библиотеки. Для объявления зависимостей понадобится тег .

Для локальных файлов Python можно поместить код в файл с расширением .py, а пути к локальным модулям указываются в строках вида пути: ключ (YAML) тега .

Создадим файл Python example.py с функциями:

from random import randint def add_two_numbers(x, y): return x + y def generate_random_number(): x = randint(0, 10) return x

Импортируем его в HTML с тегом , в :

    - paths: - /example.py  

Let's print random numbers

Doe's lucky number is from example import generate_random_number pyscript.write('lucky', generate_random_number())

Вот что вернётся:

PyScript поддерживает сторонние библиотеки:

    - numpy - requests   import numpy as np import requests  
Настраиваем метаданные

С помощью тега в формате YAML можно задать и настроить общие метаданные приложения PyScript. Использовать этот тег можно так:

 - autoclose_loader: false - runtimes: - src: "https://cdn.jsdelivr.net/pyodide/v0.20.0/full/pyodide.js" name: pyodide-0.20 lang: python 

Вот необязательные значения, которые предоставляются :

  • autoclose_loader (логическое значение): если оно false, загрузочный экран-заставка в PyScript не закроется;
  • name (строка): название пользовательского приложения;
  • version (строка): его версия;
  • runtimes (среды выполнения): список конфигураций среды выполнения с полями src, name и lang.

Заключение

Вы узнали, что такое PyScript и как его использовать в HTML-файлах для запуска кода Python в браузере, а также познакомились с различными операциями и функционалом PyScript. С помощью PyScript проще запускать и выполнять операции Python в вебе. Это отличный инструмент для всех, кому не терпится опробовать Python в Интернете.

PyScript находится на ранних стадиях разработки и активно дорабатывается. Он остаётся на стадии альфа-тестирования и сталкивается с известными проблемами, такими как время загрузки, которое может повлиять на удобство использования (на момент написания этой статьи другие операции не отображались из-за проблем с производительностью). Поэтому пока не стоит использовать его в продакшене: вероятно, будет много критических изменений.

  • Официальный сайт PyScript.
  • Блог Anaconda.
  • Исходный код PyScript.
  • Руководство для начинающих работу с PyScript.

А пока PyScript развивается, мы поможем прокачать ваши навыки или с самого начала освоить профессию, актуальную в любое время:

  • Профессия Fullstack-разработчик на Python
  • Профессия Data Scientist

Из опыта Web-мастера: переползаем на Python

Осенью прошлого года был запущен сайт www.iso.ru, разработанный компанией ADT. «Движок» сайта, представляющий собой набор CGI скриптов, был написан на Perl. По прошествии полугода эксплуатации возникла необходимость расширить функциональность сайта. Поэтому встал вопрос о выборе языка для написания скриптов.

Perl хорошо подходит для обработки текстов и широко используется для web-программирования, однако программы, написанные на Perl, трудночитаемы и неудобны для сопровождение из-за специфического синтаксиса Perl’a. Если стоит задача быстро написать небольшой скрипт усилиями одного человека и у вас специфический склад мышления, то, возможно, Perl — это то, что вам нужно. Если же требуется разработать достаточно сложную систему и затем организовать ее поддержку коллективом специалистов, то для этих целей, на мой взгляд, более подходит Python.

Python сочетает в себе понятный синтаксис и мощь, имеет развитые средства обработки текста и создания web-приложений. Python доступен для различных операционных систем, таких как UNIX (Linux), MacOS, MS-Windows 3.1, Windows NT, OS/2 и даже MS-DOS. Скрипты, написаные на Python являются хорошо переносимыми между платформами. Если бы возникла задача перенести сайт www.iso.ru с платформы Linux на Windows NT, потребовались бы минимальные изменения кода (по существу, пришлось бы только исправить пути к файлам шаблонов). Впрочем, более подробно о достоинствах Python’а вы можете узнать из статьи «Знакомьтесь — Python» Якова Марковича, опубликованной в Журнале №1.

Таким образом, решено было использовать Python для написания скриптов для сайта www.iso.ru. «Движок» сайта состоял из следующих логических частей (скриптов):

  • Главная страница — вывод главной страницы сайта, списка новостей и событий.
  • Новости — вывод текста новости, списка архивных новостей сайта, клуба, технологий.
  • События — вывод текста события.
  • Регистрация — осуществление процедуры регистрации посетителя: запись в базу данных информации о посетителе, контроль уникальности учетных записей.
  • Работа с посетителями — проверка входного имени и пароля, организация скачивания файлов с сайта, подписка на новости, доступ к страницам технической поддержки.
  • Формоотправитель — скрипт, занимающийся отправкой заполненых посетителем форм на e-mail поддержки сайта.
  • Журнал — работа с базой данных журнала статей по IT-технологиям.
  • Гостевая книга — запись и просмотр комментариев к статьям журнала.
  • Конференции
  • Административный интерфейс — редактирование таблиц базы данных сайта, загрузка новых статей, новостей, событий, выгрузка данных из базы в формат CSV, управление конференциями.

В первую очередь было решено расширить функциональность журнала -добавить систему оценки статей и сервис выбора самой интересной в данном номере. Таким образом, в список потребовалось добавить еще один скрипт. Все остальные скрипты также нужно было в большей или меньшей степени усовершенствовать.

Все скрипты написаны достаточно стандартным образом: создается экземпляр класса FieldStorage, который читает содержимое формы, затем, в зависимости от наличия и содержания определенных ключей организуется ветвление, обработка данных и вывод результата. В этой статье мне хотелось бы только поделиться опытом преодоления некоторых трудностей, возникших при разработке скриптов для www.iso.ru.

Формирование HTML из шаблонов

Как известно, вывод любой CGI программы состоит из двух частей: заголовка и данных, которые разделяются пустой строкой. Сначала программа должна сообщить клиенту, какой тип данных он будет получать. Это достигается печатью набора HTTP заголовков в стандартный вывод. Например, строка

print ‘Content-Type: text/html\n’

сообщает браузеру, что он будет получать стандартный HTML.

Затем, после разделительной строки, идут произвольные данные (обычно, код HTML). Конечно, можно просто вывести HTML текст оператором print , вставленным в тело программы, но это подходит лишь для небольших фрагментов HTML кода. Когда же необходимо вывести несколько десятков строчек, исходный текст программы становиться очень большим и нечитаемым, к тому же иногда необходимо использовать одни и те же фрагменты кода с незначительными изменениями. В этом случае удобно использовать шаблоны.

Шаблон представляет собой текстовый файл, содержащий HTML код с переменными, которые впоследствии будут заменяться необходимыми значениями. Имена переменных желательно сделать такими, чтобы исключить их случайное повторение внутри HTML кода (например, не нужно использовать переменную с именем table , так как потом в результате пострадают все определения таблиц). Для переменных в своих шаблонах я использую следующее соглашение: имя переменной начинается и заканчивается символом $ (например, $var_name$ ). Это исключает возмоожность совпадения с тегами HTML и словами в тексте документа.

Вот пример шаблона гостевой книги, хранящийся в файле guestbook.tmpl:

Для удобства работы можно написать функцию, читающую шаблон и заменяющую все переменные в нем на нужные значения. Она получает в качестве аргументов имя шаблона и словарь, представляющий собой набор пар : . Возвращает функция сконструированный текст. Функция может выгладеть примерно так:

def replace_tmpl( tmpl, var_list ):
lines = open( tmpl ).readlines()
src = «%s»*len(lines) % tuple(lines)
for key, var in var_list.items():
src = string.replace( src, key, var )
return src

А вот скрипт, выводящий запись в гостевой книге:

print ‘Content-Type: text/html\n\n’
guestbook = ‘/usr/local/apache/cgi-bin/templates/guestbook.tmpl’
body = replace_tmpl(guestbook, ‘$author$’ : ‘Артемов Олег’, ‘$message$’ : ‘Очень полезная статья’>) print body

Все динамические странички на сайте www.iso.ru формируются таким способом.

Работа с сервером баз данных MySQL

Практически любой сайт, содержащий элементы взаимодействия с пользователем использует какие-либо базы данных. Сайт www.iso.ru не является исключением. В базе данных хранятся новости, события, статьи журнала, информация по зарегистрированным пользователям и многое другое. Мы используем сервер баз данных MySQL.

На данный момент MySQL является наиболее популярной платформой для создания web-приложений, так как это простой и в тоже время довольно мощный и надежный SQL сервер. MySQL как и Python поддерживает широчайший спектр платформ, включая Linux и Windows NT. Для работы с MySQL в Python используется библиотека MySQLdb, существующая как для Linux, так и для Win32.

Работа с базой данных проходит достаточно стандартно. Сначала создается объект, устанавливающий соединение с БД (Connection Object):

Затем создается объект-курсор:

После этого можно выполнять любые SQL запросы к базе данных:

cursor.execute(‘SELECT * FROM guestbook ORDER by date DESC’)

Далее получаем результат запроса:

Метод fetchall возвращает кортеж записей, состоящих из кортежей полей, которые можно перебрать в цикле. Приведенная ниже программа выбирает из базы гостевой книги все сообщения автора «Иванов», подставляет их в шаблон и передает браузеру.

print ‘Content-Type: text/html\n\n’
guestbook = ‘/usr/local/apache/cgi-bin/templates/guestbook.tmpl’
mydb=MySQLdb.Connect(db=’iso’,host=’localhost’,
user=’root’,unix_socket=’/tmp/mysql.sock’)
cursor.execute(‘SELECT date, author, massage FROM guestbook WHERE author=»Иванов»‘)
resultset = cursor.fetchall()
body = »
for row in resultset:
body = body+replace_tmpl(guestbook, ‘$message$’ : str(row[2]))
print body

Отправка форм

Часто возникает задача передачи данных от пользователя на сайт (пожелания по работе сайта, материалы, которые пользователю хотелось бы разместить на сайте и т.д). В простейшем случае — это текстовое сообщение, набираемое в форме и посылаемое затем на электронный адрес поддержки сайта. В этом случае форма может выглядеть следующим образом:

Для отправки сообщений по протоколу SMTP нужно использовать библиотеку smtplib . Определяя экземпляр класса SMTP, устанавливаем соединение с SMTP сервером:

Формируем тело сообщения из полученных данных в соответствии с RFC822:

form = cgi.FieldStorage()
keys = <>
for k in form.keys():
keys[k] = form[k].value
msg = «»»Subject: Новость\n #тема сообщения

From: Intersoft Web Server \n #отправитель
MIME-Version: 1.0\n #версия MIME
Content-Type: text/html\n\n #тип сообщения

Имя: %s #тело сообщения

E-mail: %s

Тема: %s

Сообщение: %s»»» % \
(keys[‘name’], keys[’email’], keys[‘tema’], keys[‘message’])

Затем вызываем метод sendmail для отсылки сообщения:

mail.sendmail( ‘admin@iso.ru’, ‘market@iso.ru’, msg )

Здесь admin@iso.ru — адрес отправителя, market@iso.ru — адрес получателя. Можно реализовать и более сложную функциональность с пересылкой вложенных файлов. Для начала в форму нужно добавить поле ввода file:

Для создания почтового сообщения с вложениями удобно пользоваться классом MimeWriter , определенным в модуле MimeWriter . Чтобы избежать загромождения тела программы, можно написать функцию, получающую на входе текст сообщения ( text ), содержание поля file формы ( file ), имя файла ( name ), тему письма ( subj ), адрес получателя ( address ) и отправляющую по этому адресу письмо с вложением. Отправителем в данном случае всегда является admin@iso.ru.

Функция представляет файл в кодировке base64 и конструирует многокомпонентный документ MIME, который отправляет по адресу address .

import mimetools, MimeWriter, StringIO, smtplib, cgi, os
#задаем каталог для временных файлов
temp_dir = ‘/tmp/’

def send_attach(text, file, name, subj, address):
#полное имя временного файла
tmp_file = temp_dir + name + ‘.txt’
#имя загружаемого файла
src_file = temp_dir + name
#принимаем загружаемый файл
infile = open(src_file, ‘wb’)
#и записываем его в каталог для временных файлов
infile.write(file)
infile.close()
#создаем экземпляр класса MimeWriter
outfile = open(tmp_file, ‘wb’)
mw = MimeWriter.MimeWriter(outfile)
#создаем объект для записи многокомпонентного сообщения
mw.startmultipartbody(«mixed»)
#записываем заголовки
mw.flushheaders()
#создаем часть сообщения типа text/html и записываем туда text
subpart = mw.nextpart()
pout = subpart.startbody(«text/html», [])
pout.write(text)
#создаем следующую часть сообщения
subpart = mw.nextpart()
#добавляем заголовок
subpart.addheader(‘Content-transfer-encoding’, ‘base64’)
#определяем тип как application/octet-stream
pout = subpart.startbody(«application/octet-stream», [(«name», name)])
#открываем загружаемый файл и кодируем его в base64,
#результат записываем в pout
infile = open(src_file, «rb»)
mimetools.encode(infile,pout,’base64′)
infile.close()
#завершаем многокомпонентное сообщение
mw.lastpart()
outfile.close()

#далее посылаем стандартное сообщение с помощью класса SMTP,
#тело сообщения читаем из сформированного ранее файла.
f = open(tmp_file, ‘rb’)
msg = f.read()
f.close()
mail=smtplib.SMTP(«smtpserver.ru»)
out = StringIO.StringIO()
out.write( «Subject: %sn» % subj )
out.write( «From: %sn» % ‘Intersoft Web Server ‘ )
out.write( «MIME-Version: 1.0\n» )
out.write( msg )
mail.sendmail( ‘market@iso.ru’, address, out.getvalue() )
out.close()
#удаляем временные файлы
os.unlink(src_file)
os.unlink(tmp_file)

А вот пример использования этой функции:

send_attach(msg, form[‘attach’].value, form[‘attach’].filename.split(»)[-1], ‘Attachment’, ‘market@iso.ru’)

Проверка корректности форм

Большинство CGI-скриптов работают с данными, полученными из форм. Для успешного использования этих данных необходимо проверить их корректность. В простейшем случае, это — просто проверка существования заполненного поля:

form = cgi.FieldStorage()
if form.has_key(‘keyname’):
#действия с данными

В более сложных случаях, таких как проверка корректности введенного e-mail адреса требуется использование модуля re для сопоставления полученных данных с регулярными выражениями. Например, регулярное выражение [-_w0-9]+@[-_w0-9]+ . w+ определяет e-mail адрес следующим образом: [-_w0-9] обозначает любую букву, цифру или знак «-» и «_», + — одно или более повторений предыдущего выражения, @ — «собака», . — точка, w+ — не менее одной буквы. Таким образом все адреса вида name@domain1.domain2 попадают под это определение.

Для облегчения сопровождения сайта был разработан административный интерфейс — набор скриптов для контроля за контентом. Он состоит из следующих частей:

  1. Главный административный скрипт; скрипт позволяет:
    • добавить новость, событие, статью в журнал, создать новую тему для журнала и новый журнал со статьей;
    • редактировать (и удалять) новости, события, статьи журнала, темы журнала, атрибуты пользователей, комментарии к статьям.
  2. Скрипт управления конференциями; скрипт обеспечивает просмотр и удаление сообщений, добавление новых конференций.
  3. Скрипт выгрузки данных; скрипт отвечает за экспорт данных из таблиц в формат CSV.

Все скрипты достаточно жестко привязаны к структуре сайта, поэтому нет смысла подробно разбирать их. Хочу затронуть только один момент: удобно сделать отдельную таблицу для размещения информации о полях таблиц, используемых скриптами сайта. Это позволит писать универсальные функции администрирования для разных таблиц. Например, функция, реализующая вывод списка записей на нашем сайте построена следующим образом: на входе она получает имя таблицы, по нему читается информация о таблице из служебной таблицы (названия полей, выводить ли поле в списке и т.д.) и на основании полученной информации выводится список записей. Так как список, состоящий из всех полей, очень громоздкий (статья в журнале может занимать несколько страниц), в списке выводятся только те поля, для которых в служебной таблице стоит флаг вывода в списке. Благодаря этому добавление новых таблиц в базу требует лишь записи информации о них в служебную таблицу.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *