Hola, un nuevo post para la serie CCNA Devnet y esta vez le toca a Python, a modo introductorio pensado para la certificación, ya que hay muy buenos tutoriales en la red, por lo que en referencias estaré colocando en los enlaces.
Este post estará enfocado en lo que pude ver que preguntaban en el examen y de seguro debes saber: como utilizar la librería requests. ¿Quieres comprender las preguntas relacionadas a requests?, pues sigue leyendo:
1. Inicia tu IDE Python
Aunque será explicado con GIF, puedes verlo por ti mismo las líneas aquí mostradas. En caso que quieras probarlo en tu ordenador, te recomiendo que veas el post anterior Parte 2/6: CCNA Devnet 200-901 – 𝗣𝗿𝗲𝗽𝗮𝗿𝗮 𝘁𝘂 𝗣𝗖. ¿No puedes instalar un IDE Python en tu PC por algún motivo (PC de trabajo, políticas, etc)? No te preocupes, hay un IDE de Python en línea que puedes usar: https://repl.it/
IDE Python online: Repl
Repl.it es una página que te permite correr código directo en tu navegador. Con más de 50 lenguajes disponibles, entre ellos, Python, es tan sencillo como ingresar a este link y comenzar a escribir el código y luego dar clic en Run.
Un dato curioso es que la definición de REPL es: “Read–eval–print loop”. Mayor información aquí.
Nota: Repl no necesitas tener una cuenta para poder utilizarlo, pero si quieres que tus progresos se guarden, crear una cuenta permite almacenarlos.
2. Hello World
¿Qué tal si comenzamos con escribir algo en Python que imprima en pantalla Hola Mundo?. Intentemos hacerlo directamente a ver que pasa:
Genera un error. El problema es que Python está intentando ejecutar Hola Mundo pero no sabe que es. Nosotros sabemos que es una cadena de caracteres, pero el no. Para decirle a Python que es una cadena de caracteres, debes encerrarlo en una de estas 4 opciones:
- ‘comillas sencillas‘
- “comillas dobles“
- ”’comillas sencillas triples”’ o
- “””comillas dobles triples“””
Los datos en el medio de las comillas se le conocen como string.
Intentemos ahora diciéndole a Python que será una cadena de caracteres o string:
No muestra error, pero no despliega la información en la terminal. Para poder imprimir en ella es necesario utilizar “algo” que le diga a Python que haga eso: una función (function). Python viene con muchas funciones que te permiten realizar diferentes acciones y una de ellas es print(). Esta función te permite enviar lo que pongas en el medio de los paréntesis, data al terminal. En esta ocasión coloquemos nuestro string dentro la función print(), quedando como resultado: print(“Hola Mundo”). Veamos el resultado:
¡Listo, Nuestra primera línea de código en Python!
3. Variables
Otra característica que tiene todo lenguaje de programación son las variables. Ellas te permiten guardar información. Para asignar información a ellas, su formato sería:
- var = info_a_guardar
Existen diferentes tipos de datos. Hasta ahora hemos visto el tipo de dato string. Aprendamos un nuevo tipo de datos: int. Esta última es para almacenar números enteros. Veamos un ejemplo y combinarlo con el ejemplo anterior:
print('Hola Mundo')
a= 1000
b= "Hola Mundo"
print(a,b)
Podemos ver en la terminal que imprime en nuestro 1er print Hola Mundo y luego en el 2do print la variable a y b con la info 1000 Hola Mundo.
Nota que las variables no le he colocado comillas dentro de la función print() ya que queremos que la interprete como variable y no como la letra a o b. Otro dato interesante es que dentro de la función están separados por una coma (,). Esto indica que puedes enviar varias variables o cadenas de caracteres separados por coma.
Nota: A diferencia de otros lenguajes, Python puedes utilizar variables inmediatamente sin tener que inicializarlas (indicar tipo de datos).
4. Funciones integradas
En nuestro Hola Mundo, aprendimos que existe la función print(). La misma ya viene integrada y lista para usarse. Existen otras funciones integradas interesantes como: input(). Esta te permite obtener datos desde la terminal. Veamos como funciona:
print('Hola Mundo')
a= 1000
b= "Hola Mundo"
print(a,b)
c= input("Introduzva un dato: ")
print("El valor de c es: ", c)
Introducimos el valor “Kevin”, lo guardamos en la variable c y luego imprimimos el valor. Nuevamente a print() se le envía dos datos, una cadena de texto que dice “El valor de c es: ” y la variable c, separadas por una coma (,)
Nota: Puedes ver todas las funciones integradas con la función dir(__builtins__)
>>> dir(__builtins__) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BufferError', 'BytesWarning', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'ReferenceError', 'RuntimeError', 'RuntimeWarning', 'StandardError', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__debug__', '__doc__', '__import__', '__name__', '__package__', 'abs', 'all', 'any', 'apply', 'basestring', 'bin', 'bool', 'buffer', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'cmp', 'coerce', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'intern', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'raw_input', 'reduce', 'reload', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'unichr', 'unicode', 'vars', 'xrange', 'zip']
5. Funciones externas: PIP
Una función muy utilizada en el examen es requests. Esta función no es parte de las librería integrada, debes descargarla de internet. Pero tranquilo… Python te facilita esta tarea.
Un módulo que viene por defecto al instalar Python (desde la versión 3.4) es pip que significa Package Installer for Python. Este módulo te permite descargar librerías.
Si utilizas repl.it, no es necesario instalar el módulo requests, ya que ellos lo hacen automáticamente por ti, pero en caso que estés realizándolo desde tu ordenador, debes instalarlo con el comando pip install requests.
Para poder utilizar estas funciones, necesitas importarlas en tu área de trabajo. el comando para realizarlo es import LIBRERIA. Con esto llamas la librería con todas sus funciones.
Lo bonito de Python, es que si no tienes las funciones, con un solo comando puedes descargar su librería y utilizar sus funciones inmediatamente.
6. Requests
Esta función te permite conectarte por web de modo HTTP o HTTPS (lo que uno hace al navegar normalmente), pero desde Python.
¿Y qué funciones hay dentro de esta librería?, bueno, una pregunta importante. Puedes realizar los siguientes métodos:
La forma de llamarlos es agregando un punto (.) a la librería y colocar la función a utilizar. Ejemplo: requests.get() o requests.post(). Un ejemplo de su uso son las siguientes líneas:
requests.get('https://api.github.com/events')
requests.put('https://httpbin.org/put', data = {'key':'value'})
requests.delete('https://httpbin.org/delete')
requests.post('https://httpbin.org/post', data = {'key':'value'})
Naveguemos a la página http://www.webcode.me con Python y luego con nuestro navegador y ver sus similitudes:
import requests
resp = requests.get("http://www.webcode.me")
print(resp.text)
¿Puedes observar que obtienes la misma información?, ya puedes navegar por HTTP o HTTPS con Python.
Aquí hay un detalle, en la impresión no coloqué la variable resp solamente, sino que fue resp.texty hay una razón por ello. Lo que pasa es que la función requests.get devuelve un objeto.
Espera ¿un objeto?… ¿Qué es un objeto? bueno, en resumidas cuentas:
son agrupaciones de variables (llamadas atributos) y funciones (llamadas métodos) especialmente diseñadas que trabajan juntas para hacer algo útil.
De hecho, ¡Todo en Python son objetos!, si…, TODOS. Inclusive nuestro Hola Mundoera un objeto que devuelve una variable tipo string. ¿Quieres ver un ejemplo?, ejecuta la siguiente línea:
> print("Hola Mundo".upper())
HOLA MUNDO
>
Puede que estés confundido ahora mismo, pero míralo como un nombre donde agrupas muchas cosas. De hecho la función requests.get devuelve muchos resultados guardados en una variable, no solamente el cuerpo del contenido, sino el resultado de la petición, el encabezado, etc.
En nuestro ejemplo, solo preguntamos por el cuerpo del contenido resp.text, pero existen muchos otros.
Lastimosamente en repl.it no permite visualizar los objetos dentro de una librería llamada con import (Que yo conozca. Si sabes como, dímelo en los comentario). Es por esto que me encanta Atom con sus complementos Kite e Hydrogen, ya que puedes ver inmediatamente las opciones:
import requests
resp = requests.get("http://www.webcode.me")
resp.status_code
resp.url
resp.request
resp.headers
print(resp.text)
Nota: Atom y sus paquetes mostrados aquí, puedes ver su instalación en mi post Parte 2/6: CCNA Devnet 200-901 – 𝗣𝗿𝗲𝗽𝗮𝗿𝗮 𝘁𝘂 𝗣𝗖.
7. Pregunta de examen
En Cisco CCNA Devnet, pude observar que las preguntas giraban alrededor de comprender el uso de la librería requests de Python aplicado al servidor Cisco DNA Center.
Por suerte, Cisco tiene un servidor DNA Center disponible para probar, aquí los datos:
url= https://sandboxdnac.cisco.com/
user= devnetuser
pass= Cisco123!
Si ingresas al link, te solicitará usuario y contraseña y te redireccionará dentro del Dashboard de esta plataforma. Entremos a la plataforma como cualquier usuario normal.
Si utilizáramos este enlace para consumir la data interna con la librería requests, sería muy complicado porque enviaría mucha información HTML innecesaria.
Para evitar este problema, nos dan otro enlace a ingresar a la plataforma, pero solo regresa la data necesaria y estructurada. Esta vez ingresemos a un modo que los programas puedan interactuar facilmente.
Repitamos los pasos para ingresar a la plataforma, pero esta vez con una REST API, ingresando al siguiente link.
https://sandboxdnac.cisco.com/dna/system/api/v1/auth/token
user= devnetuser
pass= Cisco123!
Aquí el código para hacerlo:
import requests
resp2 = requests.post("https://sandboxdnac.cisco.com/dna/system/api/v1/auth/token",auth=('devnetuser', 'Cisco123!'), verify=False)
print(resp2.text)
Verás que en este ejempl usamos el parámetro interno auth para enviar los datos de usuario y contraseña con autenticación básica*.
¿Y como sabía que podría utilizar auth?… Bueno, no lo sabía, pero todo método post debe tener algún parámetro que envíe datos ¿no?, Así que nos guiamos con la ayuda interactiva, o ir a la fuente de la función, porque no sabemos que pensaron al momento de diseñarla:
El resultado de resp2.text es un token en formato JSON, que debemos usar en nuestras peticiones futuras al Cisco DNA Center. El token tiene un tiempo de expiración generalmente. En este caso es de 1 hora.
y ¿Qué es JSON?, bueno aquí un post para tener una idea: Pizza con Python
¿Cómo usarlo en Python?, bueno, esto queda para nuestro próximo futuro post…
*: Existen varios métodos de autenticación para web como Basic, Digest, Bearer, NTLM, Negotiate, etc. Cisco DNA Center utiliza el método Basic.
Conclusiones
Cuando comienzas algo nuevo como aprender un idioma, es difícil avanzar si no sabes que puedes hacer. Es por esto que es altamente recomendable instalar ayudas dentro de tu IDE.
Bueno ha terminado este artículo. Espero que les haya dado una guía para comprender un poco sobre Python orientado a la certificación CCNA DEVNET.
¿Dudas, opinión o sugerencias? Déjame tus comentarios.
Si te interesa alguno de nuestros servicios o leer todos nuestros posts, puedes localizarlos por esta red social o en nuestro portal SYNCORP. Gracias por la lectura.
Referencias:
Guía de librería requests:
https://requests.readthedocs.io/en/master/user/quickstart/
https://stackabuse.com/the-python-requests-module/
Cisco learning info:
https://developer.cisco.com/learning/modules/programming-fundamentals
https://developer.cisco.com/learning/modules/dnav3-intro-dnac
