miércoles, 14 de febrero de 2024

Python (I) Web Services Client (I) . Castilla

 1. Instalar la librería "request", y otras más en un entrono virtual

Si tenemos uina versión avanzada de Ubuntu, necesitamos instalar python en un entorno virtual.

Dicho entorno virtual se crea en una carpeta.

Cuando se instala python en dicha carpeta, crea 4 subcarpetas (bin, include, lib, lib64 y pyvenv.cfg)

Ahora para instalar el paquete request, hay que indicarle la ruta donde está instalado el python en dicho entorno virtual (dentro de la subcarpeta bin) , sinó no deja instalar.

OJO: Cuando se abra VStudio, hay que decirle que abra la carpeta donde se ha instalado el entorno virtual, de lo contrario no reconocerá las librerías instaladas. en mi caso es ~/MyOdoo/Control-Presencia

En una ventana de comandos ejecutar:

#0.Instalar dependencias necesarias
sudo apt install libpq-dev python3-dev

#1.Instalar Python3.11 en un entrono virtual
sudo apt install python3.11-venv

#2.Crear entrono virtual en ~/MyOdoo/Control-Presencia
#  OJO: Este directorio és el que tenemos que elegir en VS para que reconozca el 
#       el entorno donde se instralaran o se han instalado las librerias.
#       Para ello, una vez instaladas las librerias, se abrirá VStudio y se le dirá
#       File -> Open Folder y se indicara la carpeta ~/MyOdoo/Control-Presencia          

python3 -m venv ~/MyOdoo/Control-Presencia #3.Cambiamos de directorio.

cd ~/MyOdoo/Control-Presencia #4.Instalamos el paquete request indicando la ruta del ejecutable python en
#  el entorno virtual 
./bin/python -m pip install requests

#5.Instalamos la libreria para tratar XML
./bin/python -m pip install elementpath

#6.Instalamos la libreria para tratar YML
./bin/python -m pip install pyyaml

#7.Instalamos la libreria para conectase con Oracle
./bin/python -m pip install oracledb

#8.Instalamos la libreria para conectase con Postgres
./bin/python -m pip install psycopg2

#8.Instalamos la libreria para trabajar con arrays
./bin/python -m pip install numpy

#9.Instalamos la libreria para trabajar con pdf
./bin/python -m pip install -U pypdfium2

#10.Instalamos la libreria para trabajar con ocr
sudo apt install tesseract-ocr
./bin/python -m pip install pytesseract

./bin/python -m pip install opencv-contrib-python
./bin/python -m pip install imutils
./bin/python -m pip install matplotlib

sudo apt install libmagickwand-dev
./bin/python -m pip install Wand

./bin/python -m pip install deskew

./bin/python -m pip install easyocr

./bin/python -m pip install Filetype
./bin/python -m pip install pandas
./bin/python -m pip install openpyxl
./bin/python -m pip install xlrd
./bin/python -m pip install matplotlib

./bin/python -m pip install py7zr
./bin/python -m pip install python-magic

./bin/python -m pip install cmislib

./bin/python -m pip install tk



OJO: Para que funcione tkinter (tk) en Ubuntu hay que hacer

sudo apt-get install python3-tk

En Pycharm hacemos

- Ir a Python Packages 

- Dar el nombre del paquete e instalar (requests, elementpath, pyyaml, oracledb, psycopg2)



1. Crear un programa sencillo y ejecutarlo

Ahora creamos este programita ejemplo de RealPython 


import requests
api_url = "https://jsonplaceholder.typicode.com/todos/1"
response = requests.get(api_url)
print(response.json())

Lo ejecutamos y nos dice Visual Studio 

Y le contestamos que instale

y nos contesta: 

{'userId': 1, 'id': 1, 'title': 'delectus aut autem', 'completed': False}

2. Crear un programa sencillo pero real

Llenemos este código


import requests
import xml.etree.ElementTree as ET

#Definimos la URL, el conteniodo y el tipo de consulta application/soap+xml
#1. URL
api_url="https://rrhh-xxxxxx.grupocastilla.es/epsilonnetws/WSEmpleado.asmx?wsdl"

#2. Contenido
xml="""<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<ConsultaGenericaBD_XML xmlns="http://www.grupocastilla.es/epsilonnetws">
<sToken>
&lt;TOKEN&gt;
&lt;AppName&gt;AYTOXXXX_APPS&lt;/AppName&gt;
&lt;AppToken&gt;XXXXXXXXXXXXXXX&lt;/AppToken&gt;
&lt;/TOKEN&gt;
</sToken>
<nombreTabla>PERSONAS</nombreTabla>
<condicion>APELLIDO2 LIKE '%PLA%'</condicion>
</ConsultaGenericaBD_XML>
</soap:Body>
</soap:Envelope>"""
#3. Tipo de petición
headers = {'Content-Type': 'application/soap+xml; charset=utf-8'}

#--EJECUTAMOS LA PETICIÓN
print (requests.post(api_url, data=xml, headers=headers).text)


Lo ejecutamos y nos dice 


<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<ConsultaGenericaBD_XMLResponse xmlns="http://www.grupocastilla.es/epsilonnetws">
<ConsultaGenericaBD_XMLResult>
<TABLA xmlns="">
<REGISTRO>
<CAMPO NOMBRE="NIF">
<![CDATA[73XXXXXXX]]>
</CAMPO>
<CAMPO NOMBRE="ID_PF">
<![CDATA[0]]>
</CAMPO>
<CAMPO NOMBRE="APELLIDO1">
<![CDATA[XXXRIXXX]]>
</CAMPO>
<CAMPO NOMBRE="APELLIDO2">
<![CDATA[PLAXX]]>
</CAMPO>
<CAMPO NOMBRE="NOMBRE">
<![CDATA[XXXAXXX]]>
</CAMPO>
</REGISTRO>
<REGISTRO>
<CAMPO NOMBRE="NIF">
<![CDATA[XXXXXXXXX]]>
</CAMPO>
<CAMPO NOMBRE="ID_PF">
<![CDATA[0]]>
</CAMPO>
<CAMPO NOMBRE="APELLIDO1">
<![CDATA[MXXXXXX]]>
</CAMPO>
<CAMPO NOMBRE="APELLIDO2">
<![CDATA[PLAXXX]]>
</CAMPO>
<CAMPO NOMBRE="NOMBRE">
<![CDATA[JOSE]]>
</CAMPO>
</REGISTRO>
</TABLA>
</ConsultaGenericaBD_XMLResult>
</ConsultaGenericaBD_XMLResponse>
</soap:Body>
</soap:Envelope>




3. Crear un programa con un fichero de propiedades en YAML

Para simplificar trabajaremos en la misma carpeta

1. Veamos el fichero de configuración en formato YAML (c01_config.yml)


castilla:
api_url: https://rrhh-tavernes.grupocastilla.es/epsilonnetws/WSEmpleado.asmx?wsdl
headers :
Content-Type: application/soap+xml; charset=utf-8
token: >
&lt;TOKEN&gt;
&lt;AppName&gt;$APPNAME$&lt;/AppName&gt;
&lt;AppToken&gt;xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&lt;/AppToken&gt;
&lt;/TOKEN&gt;
appName: AYTOxxxx_APPS
nombreTabla: PERSONAS
xml: >
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Body>
<ConsultaGenericaBD_XML xmlns="http://www.grupocastilla.es/epsilonnetws">
<sToken>$TOKEN$</sToken>
<nombreTabla>$TABLA$</nombreTabla>
<condicion>$CONDICION$</condicion>
</ConsultaGenericaBD_XML>
</soap:Body>
</soap:Envelope>


2. Veamos una clase de utilidades para trabajar con XML (u03_XML.py)

import xml.etree.ElementTree as ET

'''
XML Utils
'''
class XMLUtils:
@staticmethod
def getElement(xmlString, tagString):
elem=ET.fromstring(xmlString)
tabla=elem.tag
level=0
while tabla!=tagString and level<10:
elem=elem[0]
tabla=elem.tag
level+=1
return elem

#Get an array of records as an array of dictionaries
@staticmethod
def getRecordsCastilla(firstElem):
records=[]
for secondElem in firstElem: # REGISTRO
#print('100 ',secondElem.tag, secondElem.attrib, secondElem.text)
dictio={}
for thirdElem in secondElem: # CAMPO
#print('200 ',thirdElem.tag, '--', thirdElem.attrib,'----', thirdElem.text)
att = thirdElem.attrib['NOMBRE']
value = thirdElem.text
dictio[att]=value
#print ('dictio=',dictio)
records.append(dictio)
return records


3. Veamos el programa principal (p03_request.py)

import sys
import requests
import yaml
import xml.etree.ElementTree as ET
from u03_XML import XMLUtils

#--------------------------------------
#1. Get properties from config file
#--------------------------------------
configFile = sys.path[0] + "/c01_config.yml"
print ('configFile:', configFile)
with open(configFile, 'r') as f:
configData = yaml.full_load(f)['castilla']
print('confiData:',configData)
#------------------------------------------------------------
#2. Define request
#------------------------------------------------------------
condicion="" # All !!!
xml=configData['xml'] \
.replace('$TOKEN$' , configData['token']) \
.replace('$APPNAME$' , configData['appName']) \
.replace('$TABLA$' , configData['nombreTabla'])\
.replace('$CONDICION$', condicion)
#------------------------------------------------------------
#3. Execute and print output to console
#------------------------------------------------------------
output=requests.post(configData['api_url'], data = xml, headers = configData['headers']).text

#------------------------------------------------------------
#3. Write output to file
#------------------------------------------------------------
fileName = sys.path[0] + "/../my-python-programs-output/p01-request-01.output.xml"
print ('fileName:',fileName)
fileOut=open(fileName,"w") # Rewrite
fileOut.write(output)
fileOut.close

#------------------------------------------------------------
#4. Extract XML info
#------------------------------------------------------------
tabla=XMLUtils.getElement(output,"TABLA")
records=XMLUtils.getRecordsCastilla(tabla)

#------------------------------------------------------------
#5. Print the records
#------------------------------------------------------------
i=0
for myrecord in records: # myrecord is a dictionary
i+=1
print(i,'--------------------------------------')
print ('myrecord=', myrecord)










No hay comentarios :

Publicar un comentario