User Tools

Site Tools


язык_программирования_python

Язык программирования Python

Виртуальная среда Python

Интерактивная оболочка

(venv1) # pip install ipython

Web приложение

Flask Gunicorn

(venv1) :~$ pip install Flask

(venv1) :~$ mkdir -p pywebd/; cd $_

(venv1) :~/pywebd$ cat app.py
from flask import Flask, send_from_directory
import os
import configparser

config = configparser.ConfigParser()
config.read('/etc/pywebd/pywebd.conf')

if 'PYWEBD_DOC_ROOT' in os.environ:
  pywebd_doc_root = os.environ.get('PYWEBD_DOC_ROOT')
else:
  pywebd_doc_root = config['default']['DocumentRoot']

app = Flask(__name__)

@app.route('/')
def index():
   return send_from_directory(pywebd_doc_root, 'index.html')

@app.route('/<path:path>')
def sendstuff(path):
        print(path)
        return send_from_directory(pywebd_doc_root, path)

if __name__ == "__main__":

  if 'PYWEBD_PORT' in os.environ: pywebd_port = os.environ.get('PYWEBD_PORT')
  else: pywebd_port = config['default']['Listen']

  app.run(host="0.0.0.0", port=pywebd_port, debug=True)
#  app.run(ssl_context=('/etc/pywebd/pywebd.crt', '/etc/pywebd/pywebd.key'), debug=True, host='0.0.0.0', port=pywebd_port)
# mkdir -p /etc/pywebd/

# cat /etc/pywebd/pywebd.conf
[default]
DocumentRoot = /var/www/
Listen = 4080
# #cp /root/wild.crt /etc/pywebd/pywebd.crt
# #cp /root/wild.key /etc/pywebd/pywebd.key
(venv1) :~/pywebd$ #export PYWEBD_PORT=4443
(venv1) :~/pywebd$ #export PYWEBD_DOC_ROOT=/var/www/html/
(venv1) :~/pywebd$ #PYWEBD_PORT=4443 PYWEBD_DOC_ROOT=/var/www/html/ python app.py

(venv1) :~/pywebd$ python app.py

(venv1) :~/pywebd$ pip freeze | tee requirements.txt

(venv1) :~/pywebd$ #pip install gunicorn
(venv1) :~/pywebd$ #gunicorn app:app --bind 0.0.0.0:8000

FastAPI Uvicorn

server# ###docker run -ti --rm --name pywebd2 python:3.11-alpine sh

/ # ### pip install poetry

server# apt install python3-poetry; export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring #https://stackoverflow.com/questions/74438817/poetry-failed-to-unlock-the-collection

/ # poetry new pywebd2

/ # cd pywebd2

/pywebd2 # poetry add fastapi dotenv uvicorn ###gunicorn 

/pywebd2 # more pyproject.toml

/pywebd2 # cat app.py
from fastapi import FastAPI
from dotenv import load_dotenv
import os

CONST_VER = "ver1.1"
hostname = os.uname().nodename

load_dotenv()
pywebd_message = os.environ.get('PYWEBD_MESSAGE')

app = FastAPI()
@app.get("/")
async def home():
   return {"data": f"{pywebd_message} from {hostname} app {CONST_VER}"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
# cat .env
PYWEBD_MESSAGE="Hello World!!!"
/pywebd2 # #export PYWEBD_MESSAGE="Another message"

/pywebd2 # poetry run python3 app.py

/pywebd2 # poetry run uvicorn app:app --reload --host 0.0.0.0 --port 4080

/pywebd2 # ###poetry run gunicorn app:app --bind 0.0.0.0:6080 -k uvicorn.workers.UvicornWorker

CRUD Rest API приложение

Zabbix API приложение

(venv1) server:~# pip install requests

(venv1) server:~# cat zab_set_map_name.py
#!/usr/bin/env python3

import requests
import json
from sys import argv

if len(argv) != 3 :
    print("You must set argument!!!\nExample: python zab_set_map_name.py 2 \"ISP 1\"")
    quit()

MAPID = argv[1]
MAPNAME = argv[2]

ZABBIX_API_URL = "http://127.0.0.1/zabbix/api_jsonrpc.php"
UNAME = "Admin"
PWORD = "zabbix"

print("\nLogin user {} to Zabbiz API".format(UNAME))
r = requests.post(ZABBIX_API_URL,
                  json={
                      "jsonrpc": "2.0",
                      "method": "user.login",
                      "params": {
                          "username": UNAME,
                          "password": PWORD},
                      "id": 1
                  })

print(json.dumps(r.json(), indent=4, sort_keys=True))

AUTHTOKEN = r.json()["result"]

#print("Rename Map with ID", MAPID, "to", MAPNAME)
print(f"Rename Map with ID {MAPID} to {MAPNAME}")

r = requests.post(ZABBIX_API_URL,
                  headers={'Authorization': 'Bearer ' + AUTHTOKEN},
                  json={
                    "jsonrpc": "2.0",
                    "method": "map.update",
                    "params": {
                        "sysmapid": MAPID,
                        "name": MAPNAME
                    },
                    "id": 2
                  })

print(json.dumps(r.json(), indent=4, sort_keys=True))

print("\nLogout user")
r = requests.post(ZABBIX_API_URL,
                  headers={'Authorization': 'Bearer ' + AUTHTOKEN},
                  json={
                      "jsonrpc": "2.0",
                      "method": "user.logout",
                      "params": {},
                      "id": 2,
                  })

print(json.dumps(r.json(), indent=4, sort_keys=True))
(venv1) server:~# chmod +x zab_set_map_name.py

(venv1) server:~# ./zab_set_map_name.py 2 "ISP 1"

Zabbix LLD приложение

gate# apt install python3-xmltodict/stable

gate# cat /etc/zabbix/dhcp-pools.py
#!/usr/bin/env python3

# Example usage:
# ./dhcp-pools.py
# ./dhcp-pools.py LAN1 defined|used

from sys import argv
import subprocess, xmltodict, json

p = subprocess.Popen("/usr/bin/dhcpd-pools -f x", stdout=subprocess.PIPE, shell=True)
(output, err) = p.communicate()
p_status = p.wait()

o = xmltodict.parse(output)

if len(argv)==1:
  r=[]
  for i in o['dhcpstatus']['shared-network']:
    s={}
    s["{#POOLNAME}"]=i['location']
    r.insert(1,s)
  print(json.dumps(r))
else:
  LANNAME=argv[1]
  USDEF=argv[2]
  res = next((sub for sub in o['dhcpstatus']['shared-network'] if sub['location'] == LANNAME), None)
  print(res[USDEF])

Дополнительные материалы

Доступ к каталогу по http

dir$ python3 -m http.server 80

Черновик

язык_программирования_python.txt · Last modified: 2025/06/13 08:32 by val