User Tools

Site Tools


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

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
язык_программирования_python [2025/01/01 13:25]
val [Web приложение]
язык_программирования_python [2025/06/03 17:27] (current)
val [Web приложение]
Line 19: Line 19:
 </​code>​ </​code>​
  
 +
 +===== Интерактивная оболочка =====
 +<​code>​
 +(venv1) # pip install ipython
 +</​code>​
 ===== Web приложение ===== ===== Web приложение =====
 +
 +  * [[#​Виртуальная среда Python]]
 +
 +==== Flask Gunicorn ==== 
  
   * [[https://​python.ivan-shamaev.ru/​run-install-deploy-flask-web-app-docker-dockerfile-compose/​|Создание Web-приложения Flask и деплой с помощью Docker Compose & Dockerfile]]   * [[https://​python.ivan-shamaev.ru/​run-install-deploy-flask-web-app-docker-dockerfile-compose/​|Создание Web-приложения Flask и деплой с помощью Docker Compose & Dockerfile]]
   * [[https://​blog.miguelgrinberg.com/​post/​running-your-flask-application-over-https|Running Your Flask Application Over HTTPS]]   * [[https://​blog.miguelgrinberg.com/​post/​running-your-flask-application-over-https|Running Your Flask Application Over HTTPS]]
   * [[https://​docs.python.org/​3/​library/​configparser.html|configparser — Configuration file parser]]   * [[https://​docs.python.org/​3/​library/​configparser.html|configparser — Configuration file parser]]
- 
-  * [[#​Виртуальная среда Python]] 
  
 <​code>​ <​code>​
Line 38: Line 45:
 import configparser import configparser
  
-CONST_VER ​"ver1.1"+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 = Flask(__name__)
Line 52: Line 65:
  
 if __name__ == "​__main__":​ if __name__ == "​__main__":​
-    config = configparser.ConfigParser() + 
-    ​config.read('/​etc/​pywebd/​pywebd.conf'​) +  ​if ​'PYWEBD_PORT'​ in os.environ: ​pywebd_port = os.environ.get('​PYWEBD_PORT'​) 
-    ​pywebd_port = os.environ.get('​PYWEBD_PORT'​,​config['​default'​]['​Listen'​]+  else: pywebd_port ​= config['​default'​]['​Listen'] 
-    ​pywebd_doc_root ​os.environ.get('​PYWEBD_DOC_ROOT',​config['​default'​]['​DocumentRoot']) + 
-    app.run(host="​0.0.0.0",​ port=pywebd_port,​ debug=True) +  ​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)+ app.run(ssl_context=('/​etc/​pywebd/​pywebd.crt',​ '/​etc/​pywebd/​pywebd.key'​),​ debug=True, host='​0.0.0.0',​ port=pywebd_port)
 </​code><​code>​ </​code><​code>​
 +# mkdir -p /​etc/​pywebd/​
 +
 # cat /​etc/​pywebd/​pywebd.conf # cat /​etc/​pywebd/​pywebd.conf
 </​code><​code>​ </​code><​code>​
 [default] [default]
 DocumentRoot = /var/www/ DocumentRoot = /var/www/
-Listen = 8443+Listen = 4080 
 +</​code><​code>​ 
 +# #cp /​root/​wild.crt /​etc/​pywebd/​pywebd.crt 
 +# #cp /​root/​wild.key /​etc/​pywebd/​pywebd.key
 </​code>​ </​code>​
  
Line 71: Line 89:
 (venv1) :~/pywebd$ #export PYWEBD_PORT=4443 (venv1) :~/pywebd$ #export PYWEBD_PORT=4443
 (venv1) :~/pywebd$ #export PYWEBD_DOC_ROOT=/​var/​www/​html/​ (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$ python app.py
  
-(venv1) :~/pywebd$ pip freeze ​requirements.txt+(venv1) :~/pywebd$ pip freeze ​| tee requirements.txt 
 + 
 +(venv1) :~/pywebd$ #pip install gunicorn 
 +(venv1) :~/pywebd$ #gunicorn app:app --bind 0.0.0.0:​8000 
 +</​code>​ 
 + 
 + 
 +==== FastAPI Uvicorn ====  
 +<​code>​ 
 +# pip install fastapi dotenv uvicorn 
 + 
 +# cat app.py 
 +</​code><​code>​ 
 +from fastapi import FastAPI 
 +from dotenv import load_dotenv 
 +import os 
 + 
 +load_dotenv() 
 +pywebd_message = os.environ.get('​PYWEBD_MESSAGE'​) 
 + 
 +app = FastAPI() 
 +@app.get("/"​) 
 +async def home(): 
 +   ​return {"​data":​ pywebd_message} 
 +</​code><​code>​ 
 +# cat .env 
 +</​code><​code>​ 
 +PYWEBD_MESSAGE="​Hello World!!!"​ 
 +</​code><​code>​ 
 +# uvicorn app:app --reload --host 0.0.0.0 --port 4080 
 +</​code>​ 
 +===== CRUD Rest API приложение ===== 
 + 
 + 
 +  * [[https://​dev.to/​francescoxx/​python-crud-rest-api-using-flask-sqlalchemy-postgres-docker-docker-compose-3kh4|Python CRUD Rest API using Flask, SQLAlchemy, Postgres, Docker, Docker Compose]] 
 + 
 +===== Zabbix API приложение ===== 
 + 
 +  * [[https://​www.zabbix.com/​documentation/​current/​en/​manual/​api]] 
 +  * [[https://​sbcode.net/​zabbix/​zabbix-api-python-example/​]] 
 +  * [[https://​forum.checkmk.com/​t/​rest-api-python-question-how-to-use-variables-in-json-post-in-key-and-value/​34652]] 
 +   
 +<​code>​ 
 +(venv1) server:~# pip install requests 
 + 
 +(venv1) server:~# cat zab_set_map_name.py 
 +</​code><​code>​ 
 +#​!/​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)) 
 +</​code><​code>​ 
 +(venv1) server:~# chmod +x zab_set_map_name.py 
 + 
 +(venv1) server:~# ./​zab_set_map_name.py 2 "ISP 1" 
 +</​code>​ 
 + 
 +===== Zabbix LLD приложение ===== 
 + 
 +  * [[https://​www.geeksforgeeks.org/​python-find-dictionary-matching-value-in-list/​]] 
 +  * [[https://​docs-python.ru/​tutorial/​vstroennye-funktsii-interpretatora-python/​funktsija-next/​]] 
 +<​code>​ 
 +gate# apt install python3-xmltodict/​stable 
 + 
 +gate# cat /​etc/​zabbix/​dhcp-pools.py 
 +</​code><​code>​ 
 +#​!/​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])
 </​code>​ </​code>​
  
 ===== Дополнительные материалы ===== ===== Дополнительные материалы =====
 +
 +  * [[https://​pypi.org/​project/​ansible-output-parser/​]]
 +  * [[https://​www.cyberciti.biz/​faq/​python-run-external-command-and-get-output/​]]
  
 ==== Доступ к каталогу по http ==== ==== Доступ к каталогу по http ====
Line 87: Line 257:
 </​code>​ </​code>​
  
 +==== Черновик ====
  
язык_программирования_python.1735727107.txt.gz · Last modified: 2025/01/01 13:25 by val