вторник, 28 мая 2024 г.

Установка и использование модуля WSGI в Apache на RokyLinux 8

WSGI (Web Server Gateway Interface) интерфейс между веб-сервером и web-приложением, реализованном на языке Python.

Перед установкой модуля WSGI необходимо убедиться, что в системе уже установлен apache и Python3.
Проверка работы установленного Apache:
# systemctl status httpd
● httpd.service - The Apache HTTP Server

Проверка версии python:
# python
Python 3.9.18 (main, Jan 4 2024, 00:00:00)


Установка модуля WSGI выполняется так:
# dnf -y install python3-mod_wsgi

Теперь серверу Apache нужно "рассказать", какие файлы запускать с помощью модуля WSGI.
Для этого создадим отдельный файл в конфигурации Apache
# nano /etc/httpd/conf.d/wsgi.conf
И вписываем туда строки:
WSGIScriptAlias /wsgi /var/www/html/wsgi.py
WSGIScriptAlias /wsgicmd /var/www/wsgi

Строка «WSGIScriptAlias /wsgi /var/www/html/wsgi.py» указывает, что при обращении к http://<ipадрес>/wsgi будет запускать скрипт /var/www/html/wsgi.py
А вот следующая директива «WSGIScriptAlias /wsgicmd /var/www/wsgi» разрешает запуск любого скрипта python из директории /var/www/wsgi после обращения к URL http://<ipадрес>/wsgicmd/<Скрипт> (например, http://10.10.49.166/wsgicmd/test.py запустит скрипт /var/www/wsgi/test.py)
Для применения изменений нужно перезапустить apache:
# systemctl restart httpd

Скрипты WSGI, запускаемые через сервер apache и модуль python3-mod_wsgi должны представлять из себя файл к кодом python, содержащий функцию приложения. Функция приложения должна называться «application». Функция обязательно принимает два аргумента:
1. Словарь среды, который содержит данные о входящем HTTP-запросе (строка запроса, заголовки, входные переменные и пр). Типовое имя словаря - «environ».
2. Функция, обеспечивающая HTTP-ответ обратно клиенту. Типовое имя этой функции: «start_response». После вызова start_response функции, основная функция возвращает текстом HTML тело загружаемой браузером страницы.

Для тестирования работы WSGI можно создать файл приложения на python:
# nano /var/www/wsgi/wsgi.py
def application(environ, start_response):
    status = '200 OK'
    response_header = [('Content-type','text/html')]     
    html = 'WSGI My Test 0'.encode("utf-8")
    start_response(status, response_header)
    return [html]


Теперь обратившись по URL http://IPадрес/wsgicmd/wsgi.py мы должны получить ответ в браузере:
«WSGI My Test 0»

Если в коде python будут ошибки, то вывод ошибок будет в логах web-сервера, в файле /var/log/httpd/error_log.
Пользователю будет показано сообщение:


Получение переменных GET и POST можно организовать так:
from urllib.parse import parse_qs
# Метод parse_qs разбивает строку и преобразует переменные в массив

def application(environ, start_response):
     status = '200 OK'
     response_header = [('Content-type','text/html')]
     html = "WSGI Тест 0<br>"

     # Метод отправки запроса HTTP (GET или POST):
     html += " REQUEST_METHOD: " + environ['REQUEST_METHOD'] + "<br>"

     # Получаем переменные из метода GET
     if environ['REQUEST_METHOD'] == 'GET':
         html +="Данные из метода GET:<br>"
         html +="Полная строка запроса:<br>"
         html +=environ['QUERY_STRING']+"<br>"
         html +="Переменные GET:<br>"
         get_env = parse_qs(environ['QUERY_STRING'], keep_blank_values=True)
         for x in get_env:
             html += x + ' => ' + get_env[x][0] + "<br>"

     # Получаем переменные из метода POST
     if environ['REQUEST_METHOD'] == 'POST':
         html +="Данные из метода POST:<br>"
         html +="Полная строка запроса:<br>"
         post_str = environ['wsgi.input'].read()
         html +=post_str.decode('utf-8')+"<br>"
         post_env = parse_qs(post_str.decode('utf-8'), keep_blank_values=True)
         for x in post_env:
             html += x + ' => ' + post_env[x][0] + "<br>"

    # Тестовая форма отправки POST запроса с этой страницы
    html +="<hr>"
    html +="<form method=post>"
    html +="<input name='name_p' type='text'>"
    html +="<input name='y_p' type='text'>"
    html +="<input type='submit'>"
    html +="</form>"

    # Вывод результатов
    start_response(status, response_header)
    # Преобразуем в байтовыую строку
    html = html.encode("utf-8")
    return [html]





понедельник, 13 мая 2024 г.

Python. Использование модуля mariadb.

Для работы с Mariadb в скриптах python можно использовать модуль python mariadb.

Установку данного модуля необходимо проводить, если в системе уже установлен python3 и mariadb.

Перед установкой самого модуля нужно установить рекомендованные пакеты:
# sudo yum install pip
# sudo yum install python3-devel
# sudo yum install openssl


Затем необходимо установить репозитарий "CS Package Repository"
# wget https://r.mariadb.com/downloads/mariadb_repo_setup
# sudo ./mariadb_repo_setup


Из установленного репозитария, установить драйвер «MariaDB Connector/C»
# sudo yum install MariaDB-shared MariaDB-devel

Теперь можно наконец-то установить сам модуль mariadb:
# pip install mariadb

Скрипт установки репозитария можно удалить:
# rm -f mariadb_repo_setup


Для использования модуля mariadb файл
import mariadb
import sys


# Установка соединения:
try:
    conn = mariadb.connect(
        host="10.10.10.1",
        port=3306,
        user="user1",
        password="password1",
        database="db1")
        cur = conn.cursor()
    except mariadb.Error as e:
        print(f"Error connecting to the database: {e}")
        sys.exit(1)


# Запрос данных:
try:
    cur.execute("SELECT ids, ne_name FROM nes LIMIT 10")
except mariadb.Error as e:
    print(f"Error: {e}")


# Вывод данных:
for ids, ne_name in cur:
    print(f"ids: {ids}, ne_name: {ne_name}")

"""
Вывод будет в таком виде:
ids: 14, ne_name: SMA-UKGD-R1
ids: 15, ne_name: SMA-UKGD-S1
ids: 16, ne_name: SMA-Avr150-S1
...
"""


print(cur.fetchall())
"""
Вывод будет в таком виде:
[(14, 'SMA-UKGD-R1'), (15, 'SMA-UKGD-S1'), (16, 'SMA-Avr150-S1')...]
"""


Вывод данных в виде ассоциативного массива:
cur = conn.cursor(dictionary=True)
try:
    cur.execute("SELECT ids, ne_name FROM nes LIMIT 10")
except mariadb.Error as e:
    print(f"Error: {e}")
result = cur.fetchall()
for x in result:
    print(x)

"""
Вывод будет в таком виде:
{'ids': 14, 'ne_name': 'SMA-UKGD-R1'}
{'ids': 15, 'ne_name': 'SMA-UKGD-S1'}
{'ids': 16, 'ne_name': 'SMA-Avr150-S1'}
...
"""


# Закрытие соединения
conn.close()