0% encontró este documento útil (0 votos)
4 vistas89 páginas

Programación GUI en Python con Tkinter

El documento proporciona un curso sobre programación en Python, centrándose en la creación de interfaces gráficas de usuario (GUI) utilizando Tkinter. Se describen varios widgets de Tkinter, como botones, etiquetas y cuadros de texto, junto con ejemplos de código para su implementación. Además, se abordan conceptos de programación web y la creación de aplicaciones CGI avanzadas.

Traducido por

ScribdTranslations
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
4 vistas89 páginas

Programación GUI en Python con Tkinter

El documento proporciona un curso sobre programación en Python, centrándose en la creación de interfaces gráficas de usuario (GUI) utilizando Tkinter. Se describen varios widgets de Tkinter, como botones, etiquetas y cuadros de texto, junto con ejemplos de código para su implementación. Además, se abordan conceptos de programación web y la creación de aplicaciones CGI avanzadas.

Traducido por

ScribdTranslations
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Programación en Python

[Link]. IV Año I Sem

COLEGIO DE INGENIERÍA MALLAREDDY PARA MUJERES


(Institución Autónoma-UGC, Gobierno de la India)

PROGRAMACIÓN EN PYTHON
Course Code: CS721PE

C. RAJEEV
Prof. Asistente
CSE,
MRECW.
UNIDAD-4
UNIDAD - IV
Programación GUI: Introducción, Tkinter y programación en Python
Breve recorrido por otras GUIs, módulos relacionados y otras GUIs.

Programación WEB: Introducción, Navegación por la Web con Python, Creando


Clientes Web Simples, Clientes Web Avanzados, Servidores que Ayudan a CGI

Procesar Datos del Cliente, Construcción de Aplicaciones CGI Avanzadas, Web

(HTTP) Servidores
Programación de GUI:
Introducción:
¿Qué es una interfaz gráfica de usuario (GUI)?
La Interfaz Gráfica de Usuario (GUI) no es más que una aplicación de escritorio que te ayuda a
interactuar con las computadoras. Se utilizan para realizar diferentes tareas en los escritorios, laptops
y otros dispositivos electrónicos.

GUIapps likeText-Editorsare used to create, read, update and delete different types of
archivos.

Las aplicaciones GUI como Sudoku, Ajedrez y Solitario son juegos que puedes jugar.

Las aplicaciones GUI como Google Chrome, Firefox y Microsoft Edge se utilizan para navegar a través de

elInternet.
Bibliotecas de Python para crear interfaces gráficas de usuario:
Python ofrece varias opciones/bibliotecas diferentes para escribir programas basados en GUI.
Estos se enumeran a continuación:

1. Tkinter:It is the easiest among all libraries. It is Python'sstandard GUI(Graphical


paquete de Interfaz de Usuario). Es el kit de herramientas más utilizado para la Programación de GUI en

Python.

2. JPython: Es la plataforma de Python para Java que proporciona scripts de Python de manera fluida.

acceso a las bibliotecas de clases de Java para la máquina local.

wxPython: Es un kit de herramientas GUI de código abierto y multiplataforma escrito en C++. Es uno de los

alternativas a Tkinter, que viene incluido con Python.

Hay muchas otras interfaces (Kivy, Python QT) disponibles para GUI. Entre todas
estos, Tkinter es preferido por muchos aprendices y desarrolladores simplemente por lo sencillo

y fácil es.
¿Qué son Tcl, Tk y Tkinter?

Tkinter es la biblioteca GUI predeterminada de Python. Se basa en el kit de herramientas Tk, originalmente

diseñado para el Lenguaje de Comando Tool (Tcl).

Debido a la popularidad de Tk, se ha adaptado a una variedad de otros lenguajes de scripting.

incluyendo Perl (Perl/Tk), Ruby (Ruby/Tk) y Python (Tkinter).

tkinter es un módulo de Python integrado que se utiliza para crear aplicaciones GUI simples. Es el más

módulo comúnmente utilizado para aplicaciones GUI en Python.

No necesitas preocuparte por la instalación del módulo Tkinter, ya que viene


con Python por defecto.

>>>import Tkinter-------------python 2.x


>>>importar tkinter-------------python 3.x
Si su intérprete de Python no fue compilado con Tkinter habilitado, la importación del módulo falla:

>>>import Tkinter

Rastro de errores (el más interno último):

Archivo "<stdin>", línea 1, en ?


Archivo "/usr/lib/python1.5/lib-tk/[Link]", línea 8, en ?
import _tkinter # Si esto falla, tu Python puede no
ser configurado para Tk
ImportError: No module named _tkinter
Tkinter y programación en Python:
Crear una aplicación GUI usando Tkinter es una tarea fácil. Todo lo que necesitas hacer es realizar el

siguientes pasos −
1. importando tkinter
Es igual que importar cualquier otro módulo en el código de Python. Tenga en cuenta que el nombre del

el módulo en Python 2.x es 'Tkinter' y en Python 3.x es 'tkinter'.


importar tkinter
2. Crea la ventana principal de la aplicación GUI.

estamos realizando operaciones y mostrando visuales y todo básicamente.


3. Agrega uno o más de los widgets a la aplicación GUI.
4. Ingrese al bucle principal de eventos para tomar acción contra cada evento desencadenado por el usuario.

Un bucle de eventos básicamente le dice al código que siga mostrando la ventana hasta que nosotros

ciérralo manualmente. Se ejecuta en un bucle infinito en el back-end.


Para crear una ventana simple con el texto ¡Hola Mundo!.
importar tkinter
window = [Link]()
[Link]("INTERFAZ DE USUARIO")
para renombrar el título de la ventana
pack se utiliza para mostrar el objeto en la ventana
label = [Link](window, text = "Hello World!").pack()
[Link]()
Steps:-
1. importar el módulo tkinter.
2. Inicializa el administrador de ventanas con el método [Link]() y asígnalo a un
ventanavariable. Este método crea una ventana en blanco con cerrar, maximizar y
minimizar botones.
Tk(screenName=None, baseName=None, className='Tk', useTk=1)
Para crear una ventana principal, tkinter ofrece un método para cambiar el nombre de la ventana.

you can change theclassNameto the desired one.


El código básico utilizado para crear la ventana principal de la aplicación es-

window = [Link]()
3.(opcional) Cambia el nombre del título de la ventana como desees con el

[Link](titulo_de_la_ventana).

4. La etiqueta se utiliza para insertar algunos objetos en la ventana. Aquí, estamos añadiendo una etiqueta con

algún texto.
El atributo pack() del widget se utiliza para mostrar el widget en un tamaño que requiere.

5. Finalmente, el método mainloop() para mostrar la ventana hasta que la cierras manualmente.
Widgets de Tk:
Los widgets son algo así como elementos en el HTML. Encontrarás diferentes tipos de widgets para

los diferentes tipos de elementos en Tkinter.


1. Button :
Se utiliza para añadir botones en una aplicación de Python.

w = Botón ( maestro,opción=valor, ... )


master− Esto representa la ventana principal.
opciones− Aquí está la lista de las opciones más utilizadas para este widget.

Estas opciones se pueden usar como pares clave-valor separados por comas.

Comando--Función o método que se llamará cuando se haga clic en el botón.


Color de fondo activo: color de fondo cuando el botón está bajo el cursor.
Activeforeground---Foreground color when the button is under the cursor.
Bd-----Ancho del borde en píxeles. El valor predeterminado es 2.
Bg--Color de fondo normal.
Ex:
de tkinter import *
de tkinter import messagebox
top = Tk()
[Link]("100x100")
def holaLlamada():
msg = [Link]( "Hello Python", "Hello World")
B = Botón(arriba, texto = "Hola", comando = helloCallBack)
[Link](x = 100,y = 100)
[Link]()
2. Lienzo:
El lienzo es un área rectangular destinada a dibujar imágenes u otras complejidades.
[Link] can place graphics, text, widgets or frames on a Canvas.
Sintaxis;
w =Canvas ( maestro, opción=valor, ... )
master− Esto representa la ventana principal.
opciones− Aquí está la lista de las opciones más comúnmente utilizadas para este widget.

Estas opciones se pueden usar como pares clave-valor separados por comas.

bd--Ancho del borde en píxeles. El valor predeterminado es 2.


bg--Color de fondo normal.
confinar--Si es verdadero (el valor predeterminado), el lienzo no se puede desplazarse fuera de la
región de desplazamiento.
Cursor--Cursor utilizado en el lienzo como flecha, círculo, punto, etc.
height--Size of the canvas in the Y dimension.
Highlightcolor--Color shown in the focus highlight.
Ejemplo:

importar tkinter

top = [Link]()

C =[Link](superior, bg="azul", altura=250, ancho=300)

coord = 10, 50, 240, 210

arc = C.create_arc(coord, start=0, extent=150, fill="rojo")

[Link]()

[Link]()
3. Widget de escala:
El widget de escala se utiliza para implementar el control deslizante gráfico en las aplicaciones de Python para que

el usuario puede deslizarse a través del rango de valores mostrados en el control deslizante y seleccionar uno entre

ellos.
Podemos controlar los valores mínimo y máximo junto con la resolución de la escala.
Sintaxis
w = Escala(superior, opciones)

A continuación se presenta una lista de posibles opciones:

from_: Se utiliza para representar un extremo del rango del widget.

a: Representa un valor flotante o entero que especifica el otro extremo de la


rango representado por la escala.
orientar Se puede configurar en horizontal o vertical dependiendo del tipo de escala.
bd: El tamaño del borde del widget. El valor predeterminado es 2 píxeles.

bg: El color de fondo del widget.


font: El tipo de fuente del texto del widget.

fg: El color de primer plano del texto


Ejemplo:
de tkinter import *
master = Tk()
w = Escala(master, desde=0, hasta=100)
[Link]()
w = Escala(master, desde=0, hasta=200, orientación=HORIZONTAL)

[Link]()
buclePrincipal()
4. Etiqueta:
La etiqueta se utiliza para especificar la caja contenedora donde podemos colocar el texto o las imágenes.

el widget se utiliza para proporcionar el mensaje al usuario sobre otros widgets utilizados en Python

aplicación.
Hay varias opciones que se pueden especificar para configurar el texto o la parte de la
texto mostrado en la etiqueta.

Sintaxis:
w =Etiqueta (master, opciones)
• master es el parámetro utilizado para representar la ventana principal.
• Hay varias opciones que se utilizan para cambiar el formato del widget.
bg: establecer el color de fondo normal.
bgto establece el color de fondo normal.
comando: llamar a una función.
fuente: para establecer la fuente en la etiqueta del botón.
imagen: para establecer la imagen en el botón.
ancho: para establecer el ancho del botón.
height” to set the height of the button.
Ex:
de tkinter importar *
raíz = Tk()
var = StringVar()
label =Label( root, textvariable=var, relief=RAISED )
¡Hola!? ¿Cómo estás?
[Link]()
[Link]()

alivio
Especifica la apariencia de un
borde decorativo alrededor de la etiqueta.
El valor predeterminado es PLANO.
5. Botón de verificación:

Este widget se utiliza para mostrar una cantidad de opciones a un usuario como botones de alternancia.

el usuario puede entonces seleccionar una o más opciones haciendo clic en el botón correspondiente a cada una

opción. (similar a la entrada de casilla de verificación HTML)


botón de verificación

de tkinter import *
importar messagebox
importar tkinter
top = [Link]()
CheckVar1 = IntVar()
CheckVar2 = IntVar()
C1 = Checkbutton(top, text = "Música", variable = CheckVar1, onvalue = 1, offvalue
= 0, altura=5, ancho=20)
C2 = Checkbutton(top, text = "Video", variable = CheckVar2, onvalue = 1, offvalue =
0, altura=5, ancho=20)
[Link]() [Link]() [Link]()
6. Entrada
El widget Entry se utiliza para proporcionar un cuadro de texto de una sola línea al usuario para aceptar un

valor del usuario.


Si deseas mostrar múltiples líneas de texto que se pueden editar, entonces deberías usar
theTextwidget.
Si quieres mostrar una o más líneas de texto que no pueden ser modificadas por el usuario,
entonces deberías usar el widget Label.

Widget de Entrada
de tkinter import *
top = Tk()
L1 =Label(top, text="User Name")
[Link]( lado =IZQUIERDA)

E1 = Entrada(principal, bd=5)

[Link](side=RIGHT)
[Link]()
7. Marco:
Se utiliza para organizar el grupo de widgets. Actúa como un contenedor.
que se pueden usar para mantener los otros widgets. Las áreas rectangulares

de la pantalla se utilizan para organizar los widgets en python


aplicación.

8. Lista desplegable:

El widget Listbox se utiliza para mostrar una lista de elementos de los cuales un

el usuario puede seleccionar un número de elementos.

9. Menu:
El objetivo de este widget es permitirnos crear todo tipo de menús
que puede ser utilizado por nuestras aplicaciones. La funcionalidad central proporciona

formas de crear tres tipos de menú: emergente, de nivel superior y desplegable.


widget de marco
Widget de lista

de tkinter importar *
importar messagebox
importar tkinter
top = Tk()
Lb1 =Caja de lista(superior)

[Link](1, "Python")
[Link](2, "Perl")
[Link](3, "C")
[Link](4, "PHP")
[Link](5, "JSP")
[Link](6, "Ruby")
[Link]()
[Link]()
Menú
de tkinter importar *
importar messagebox
importar tkinter
top = Tk()
mb=Menubuton( top, text="Archivo", relief=RAISED )
[Link]()
[Link] = Menu( mb, tearoff = 0 )
mb["menu"] = [Link]
Var1 = IntVar()
Var2 = IntVar()
[Link].add_checkbuton( label="Nuevo", variable=Var1 )
[Link].add_checkbuton ( etiqueta="abrir", variable=Var2 )
[Link].add_checkbuton ( label="Guardar", variable=Var2 )
[Link].add_checkbuton ( etiqueta="Guardar como", variable=Var2 )
[Link].add_checkbuton ( label="Cerrar", variable=Var2 )
[Link].add_checkbuton ( label="Salir", variable=Var2 )
[Link]()
[Link]()
10. Botón de menú
Se puede definir como el menú desplegable que se muestra al usuario
todo el tiempo. Se utiliza para ofrecer al usuario una opción para seleccionar el

la elección apropiada existe dentro de la aplicación.

11. Message:
Se utiliza para mostrar el mensaje al usuario sobre el comportamiento
de la aplicación de python.
Muestra los mensajes de texto al usuario que no se pueden editar.
El texto del mensaje contiene más de una línea. Sin embargo, la
el mensaje solo puede mostrarse en una sola fuente.
12. Cuadro de Mensaje:

Se utiliza para mostrar cuadros de mensaje en tus aplicaciones.

Proporciona una serie de funciones que puedes usar para mostrar un


mensaje apropiado.
Algunas de estas funciones son showinfo, showwarning, showerror,
askquestion, askokcancel, askyesno, and askretryignore.
Ex: Widget de mensaje

de tkinter import *

root = Tk()

var = StringVar()

label =Message( root, textvariable=var, relief=RAISED )

¡Hola!? ¿Cómo estás?

[Link]()

[Link]()
Widget de cuadro de mensaje

de tkinter import *
desde tkinter import messagebox
top = Tk()
[Link]("100x100")
def helloCallBack():
msg = [Link]( “Say Hello", "Hello World")
B = Botón(top, texto = "Decir Hola", comando = helloCallBack)
[Link](x = 100, y = 100)
[Link]()
13. Botón de opción:
Conjunto de botones de los cuales solo uno puede ser 'presionado' (similar a

entrada de radio HTML

14. Scrollbar:
El widget de la barra de desplazamiento se utiliza para desplazar hacia abajo el contenido del

otros widgets como listbox, texto y lienzo. Sin embargo, nosotros


también se pueden crear las barras de desplazamiento horizontales para el widget Entry.

[Link]
Se utiliza para mostrar los datos de texto en la aplicación de Python.

Sin embargo, Tkinter nos proporciona el widget Entry que se utiliza


para implementar el cuadro de texto de una sola línea.

El widget de Texto se utiliza para mostrar el texto en varias líneas.

texto formateado con varios estilos y atributos.


El widget de texto se utiliza para proporcionar el editor de texto al usuario.
Botón de radio
de tkinter importar *

defsel():
selection = "You selected the option " + str([Link]())
[Link](text = selección)

raíz = Tk()
var = IntVar()
R1 = Radiobutton(root, text="C", variable=var, value=1,
comando=sel)
[Link]( ancla = O )

R2 = Botón de opción(root, texto= "C++", variable=var, valor=2,


comando=sel)
[Link]( ancla = O )

R3 = Radiobutton(root, text="PYTHON", variable=var, value=3,


comando=sel)
[Link]( ancla = W)

label = Label(root)
[Link]()
[Link]()
Ex: scroll bar:

de tkinter import *

raíz = Tk()

scrollbar = Scrollbar(root)

[Link]( lado = DERECHA, llenar = Y )

mi_lista = Listbox(raíz, yscrollcommand = [Link])

forline en rango(50):

[Link](END, "Esta es la línea número " + str(line))

[Link]( lado = IZQUIERDA, llenar = AMBOS )

[Link]( comando = [Link] )

bucle principal()
Ejemplo: texto

de tkinter importar *
def onclick():
pasar
root = Tk()
Texto(root)
[Link](INSERT, "Hola.....")
[Link](FIN, "Adiós Adiós.....")

[Link]()
text.tag_add("aquí", "1.0", "1.4")
text.tag_add("inicio", "1.8", "1.13")
text.tag_config("aquí", background="amarillo", foreground="azul")
text.tag_config("start", fondo="negro", primer_plano="verde")
[Link]()
17. spinbox:
El widget Spinbox es una variante del widget de entrada estándar de Tkinter, que puede ser
se utiliza para seleccionar de un número fijo de valores.

Ejemplo:
de tkinter import *
master = Tk()
w = Spinbox(maestro, de=0, a=10)
[Link]()
bucle principal()
Breve recorrido por otras interfaces gráficas de usuario

cuatro de los kits de herramientas más populares y disponibles que hay:

1. Tix (Extensiones de Interfaz Tk)


2. Pmw (Extensión Tkinter de Python MegaWidgets)
3. wxPython (vínculo de Python a wxWidgets) y
4. PyGTK (enlace de Python a GTK+).

El módulo Tix ya está disponible en la biblioteca estándar de Python. Debes


descarga el otro conjunto de herramientas, que son de terceros.

Pmwis es solo una extensión de Tkinter, es la más fácil de instalar (simplemente extrae en
los paquetes de tu sitio).

wxPython y PyGTK implican la descarga de más de un archivo y la construcción.

nos gustaría presentar el Control SpinButton y ComboBox.


Aplicación utilizando varias interfaces gráficas bajo Win32
1. Tix (Extensiones de interfaz Tk):
El módulo Tix proporciona un conjunto adicional rico de widgets.
La biblioteca TheTix proporciona la mayoría de los widgets comúnmente necesarios que faltan de

Tk estándar: HList, ComboBox, Control (SpinBox) y una variedad de desplazables


widgets.
Tix también incluye muchos más widgets que son generalmente útiles en una amplia gama de

applications:NoteBook, FileEntry, PanedWindow, etc.


El widget HList se puede usar para mostrar cualquier dato que tenga una estructura jerárquica, para
ejemplo, árboles de directorios del sistema de archivos
2. Pmw (extensión Tkinter de Python MegaWidgets):

Es un conjunto de herramientas para construir widgets compuestos de alto nivel en Python usando

el paquete tkinter.

Consiste en un conjunto de clases base y una biblioteca de megawidgets flexibles y extensibles


construido sobre esta base.

Estos megawidgets incluyen cuadernos, comboboxes, widgets de selección, widgets divididos,


widgets desplazados, ventanas de diálogo, etc.
wxPython (enlace de Python a wxWidgets):
Permite a los programadores de Python crear programas con una funcionalidad robusta y altamente funcional.

interfaz gráfica de usuario, de manera simple y fácil.

wxPython es de código abierto, lo que significa que es gratis para que cualquiera lo use y el código fuente

el código está disponible para que cualquier persona lo revise y lo modifique. Y cualquiera puede contribuir con correcciones o

mejoras al proyecto.

wxPython es un kit de herramientas multiplataforma. Esto significa que el mismo programa se ejecutará en

múltiples plataformas sin modificación.

Las plataformas actualmente soportadas son Microsoft Windows, Mac OS X y macOS.


Sistemas Linux u otros similares a Unix con bibliotecas GTK2 o GTK3.

En la mayoría de los casos, se utilizan los widgets nativos en cada plataforma para proporcionar un 100% nativo.

apariencia y experiencia de la aplicación.


4. PyGTK (Enlace de Python a GTK+):

GTK son herramientas de desarrollo y kits de herramientas de interfaz de usuario de código abierto y multiplataforma.

marcos

Son marcos populares en uso para Linux porque son de código abierto y brindan
desarrolladores un conjunto de herramientas poderoso para diseñar Interfaces Gráficas de Usuario.

PyGTK es un conjunto de envolturas de Python para la biblioteca de interfaz gráfica de usuario GTK+.

GTK es solo un conjunto de herramientas de widgets para las aplicaciones GNOME (colección de aproximadamente 30)

aplicaciones), LXDE (entorno de escritorio libre con recursos comparativamente bajos


requisitos) y Xfce (entorno de escritorio gratuito y de código abierto para Linux y BSD
sistemas operativos.) Entornos de Escritorio.
Módulos Relacionados y Otras GUI
Hay otros sistemas de desarrollo de GUI que se pueden usar con Python.
Programación web:
Introducción:
1. Navegación Web: Computación Cliente/Servidor (¿Otra vez?!?):

La navegación web cae bajo la misma arquitectura cliente/servidor que hemos visto.
repetidamente.

Esta vez, los clientes web son navegadores, aplicaciones que permiten a los usuarios encontrar documentos en

la World Wide Web.

Del otro lado están los servidores web, procesos que se ejecutan en el host de un proveedor de información.

computadoras. Estos servidores esperan a los clientes y sus solicitudes de documentos, las procesan y

devuelve los datos solicitados.

Aquí, un usuario ejecuta un programa cliente web como un

navegador y establece una conexión con un servidor web en otro lugar

en Internet para obtener información.


Navegación web con Python: Creando clientes web simples:
Una cosa a tener en cuenta es que un navegador es solo un tipo de cliente web. Cualquiera

una aplicación que hace una solicitud de datos a un servidor web se considera un "cliente." Es
es posible crear otros clientes que recuperen documentos o datos de Internet.

Una razón importante para hacer esto es que un navegador ofrece solo una capacidad limitada, es decir, que

se utiliza principalmente para ver e interactuar con sitios web.

por otro lado, un programa cliente tiene la capacidad de hacer más; no solo puede
descargar datos, pero también puede almacenarlos, manipularlos o quizás incluso transmitirlos a

otro lugar o aplicación.

Aplicaciones que utilizan el módulo urllib para descargar o acceder a información en la web

[usar [Link]() o [Link]()] se puede considerar un cliente Web simple.


Todo lo que necesitas hacer es proporcionar una dirección web válida.
Localizadores Uniformes de Recursos:
La navegación web simple implica el uso de direcciones web llamadas URL (Uniform Resource Locator).

Direcciones). Tales direcciones se utilizan para localizar un documento en la web o para llamar a un CGI

programa para generar un documento para su cliente.

Las URL son parte de un conjunto más amplio de identificadores conocidos como URIs (Identificadores de Recursos Uniformes)

Identificadores).

Una URL es simplemente un URI que utiliza un protocolo o esquema existente (es decir, http, ftp, etc.) como

parte de su dirección.

Al igual que las direcciones callejeras, las direcciones web tienen cierta estructura. Una dirección callejera americana

generalmente es de la forma "número designación de la calle," es decir, 123 Calle Principal. Se diferencia de

otros países, que tienen sus propias reglas.


Una URL utiliza el formato:

prot_sch://net_loc/path;params?query#frag
Una vez más, net_loc puede desglosarse en varios componentes más, algunos requeridos, otros
opcional. La cadena net_loc se ve así:
usuario:contraseña@host:puerto

De los cuatro, el nombre del host es el más importante para ejecutar un servidor web.

El número de puerto es necesario solo si el servidor web está ejecutándose en un número de puerto diferente

from the default.

Los nombres de usuario y las contraseñas se utilizan solo al hacer conexiones FTP.
Para tratar con URL en funcionalidades y capacidades completamente diferentes. Python proporciona dos

módulos diferentes,. Uno es urlparse, y el otro es urllib.

1. Módulo urlparse:
El módulo urlparse proporciona funcionalidad básica para manipular cadenas de URL.
Estas funciones incluyen-
1. urlparse()
2. urlunparse(), y
3. urljoin()
[Link]():
urlparse() descompone una cadena de URL en algunos de los componentes principales (prot_sch,

net_loc, path, params, query, frag.


It has the following syntax:
urlparse(urlstr, defProtSch=None, allowFrag=None)
urlparse() analiza urlstr en una tupla de 6 elementos (prot_sch, net_loc, path, params, query,

frag)
defProtSchindica un protocolo de red predeterminado o un esquema de descarga en caso de que no se especifique uno.

proporcionado [Link].

[Link] es una bandera que indica si se permite o no una parte de fragmento de una URL.

Aquí está lo que devuelve urlparse() cuando se le da una URL:

>>> [Link]('[Link]

ParseResult(scheme='http', netloc='[Link]', path='/doc/[Link]', params='',


query='', fragment='')
ii. [Link]():
urlunparse() hace exactamente lo contrario de urlparse() combina una tupla de 6 elementos (prot_sch, net_loc,

ruta, params, consulta, frag) urltup, que podría ser la salida de urlparse(), en una sola
Cadena URL y la devuelve.
Sintaxis:
urlunparse(urlparse(urlstr))
Ej:
Urlunparse(urlparse('[Link]
Output:
[Link]

En este caso, los parámetros, la consulta y el fragmento están todos ausentes en la URL original.

La nueva URL no se ve igual que la original, pero es equivalente según el


estándar.
iii) [Link]():
La función urljoin() es útil en casos donde se necesitan muchas URL relacionadas.
for example, the URLs for a set of pages to be generated for a Web site.

la sintaxis para urljoin() es:

urljoin(baseurl, newurl, allowFrag=Ninguno)

urljoin() toma la url base y une su ruta base (net_loc más la ruta completa hasta, pero no
incluyendo, un archivo al final) con newurl.

Por ejemplo:
>>> [Link]('[Link] \
... 'current/lib/[Link]')
'[Link]
Módulo urllib:
urllib es un módulo de Python que se puede utilizar para abrir URLs (Localizadores Uniformes de Recursos).

define funciones y clases para ayudar en acciones de URL.


Urllib es un paquete que agrupa varios módulos para trabajar con URLs, tales como:
[Link] para abrir y leer.
[Link] para analizar URL
[Link] para las excepciones generadas
[Link] para analizar archivos [Link]
Si urllib no está presente en tu entorno, ejecuta el siguiente código para instalarlo.
pip install urllib
[Link]()
urlopen() abre una conexión web a la cadena de URL dada y devuelve un objeto similar a un archivo.

sintaxis:
urlopen(urlstr, postQueryData=None)
urlopen() abre la URL apuntada por urlstr. Si no se proporciona ningún protocolo o esquema de descarga, o

si se pasa un esquema "file", urlopen() abrirá un archivo local.

Para todas las solicitudes HTTP, el tipo de solicitud normal es "GET." En estos casos, la cadena de consulta

proporcionado a la Web, debe ser dado como parte de urlstr.

Si se desea el método de solicitud "POST", entonces la cadena de consulta debe colocarse en el


variable postQueryData.
Las solicitudes GET y POST son las dos formas de "subir" datos a un servidor web. Cuando un
se establece una conexión exitosa, urlopen() devuelve un objeto similar a un archivo como si el destino fuera

un archivo abierto en modo lectura.

por ejemplo, si nuestro objeto de archivo es f, entonces nuestro "manejador" admitiría la lectura esperada

métodos como [Link](), [Link](), [Link](), [Link](), y [Link]().


[Link]():
Sintaxis:
urlretrieve(urlstr, localfile=None, downloadStatusHook=None)
En lugar de leer desde la URL como lo hace urlopen(), urlretrieve() simplemente descargará.
el archivo HTML completo ubicado en urlstr a su disco local.
Almacenará los datos descargados en un archivo local si se proporciona uno o en un archivo temporal si no.

Si el archivo ya ha sido copiado de Internet o si el archivo es local, no habrá posteriores


la descarga ocurrirá.
EldownloadStatusHook, si se proporciona, es una función que se llama después de cada bloque de datos.

ha sido descargado y entregado.


Se llama con los siguientes tres argumentos:
1. número de bloques leídos hasta ahora,

2. el tamaño del bloque en bytes, y


3. el tamaño total (en bytes) del archivo.
Esto es muy útil si estás implementando información de "estado de descarga" para el usuario en un
pantalla basada en texto o gráfica.
urlretrieve() devuelve una tupla de 2 elementos, (nombre de archivo, cabeceras mime).

filename es el nombre del archivo local que contiene los datos descargados.
mime_hdrs es el conjunto de encabezados MIME devueltos por el servidor web que responde.
[Link]() y urllib.quote_plus():
Las funciones quote() toman datos de URL y los "codifican" para que sean "aptos" para
inclusión como parte de una cadena de URL.

Sintaxis:
citar(urldata, seguro='/')
Los caracteres que nunca se convierten incluyen comas, guiones bajos, puntos y guiones.
and alphanumerics. All others are subject to conversion.

En particular, los caracteres no permitidos (?,!, espacios) se cambian a su hexadecimal


equivalentes ordinales precedidos por un signo de porcentaje (%), es decir, "%xx" donde "xx" es el

representación hexadecimal del valor ASCII de un carácter.

Ex:
>>> importar urllib
Hola Mundo@Python2
Hola Mundo@Python2
Al llamar a quote*(), la cadena theurldata se convierte en una cadena equivalente que puede ser
parte de una cadena de URL.

Ten en cuenta que la función quote() considera los caracteres seguros por defecto. Eso significa que no lo hace.

codificar / carácter .

La función quote() acepta un parámetro nombrado llamado safe cuyo valor predeterminado es/

Si también quieres codificar /carácter, puedes hacerlo proporcionando una cadena vacía
en el parámetro seguro así-
%2F
%2F‘
quote_plus() es similar a quote() excepto que también codifica espacios como signos más ( + ).
Ej:
>>> importar urllib
>>> [Link]('Hola Mundo@Python2')
Hola Mundo@Python2
[Link]()
urlencode() toma un diccionario de pares clave-valor y los codifica para ser incluidos como
parte de una consulta en una cadena de URL de solicitud CGI.

Los pares están en formato "clave=valor" y están delimitados por ampersands (&).

Ejemplo:
>>> aDict = { 'name': 'Georgina Garcia', 'hmdir': '~ggarcia' }
>>> [Link](aDict)
'name=Georgina+Garcia&hmdir=%7eggarcia'
Módulo urllib2:
urllib2 es un módulo de Python que se puede utilizar para obtener URLs.

El módulo urllib2 define funciones y clases que ayudan a abrir URL.


(principalmente HTTP) en un mundo complejo (autenticación básica y digest, redireccionamientos,

galletas y más)
Diferencia entre urllib y urllib2
Aunque ambos módulos realizan tareas relacionadas con solicitudes URL, tienen funcionalidades diferentes.

urllib2 puede aceptar un objeto Request para establecer los encabezados de una solicitud URL, urllib

acepta sólo una URL.


urllib proporciona el método urlencode que se utiliza para la generación de la consulta GET

strings, urllib2 no tiene tal función.


Clientes web avanzados
Los navegadores web son clientes web básicos. Se utilizan principalmente para buscar y

descargando documentos de la web.


Los clientes avanzados de la Web son aquellas aplicaciones que hacen más que solo descargar.

documentos individuales de Internet.


Podemos explorar y descargar páginas de Internet por diferentes razones, algunas de
que incluyen:
● Indexando en un gran motor de búsqueda como Google o Yahoo!
● Navegación sin conexión descargando documentos en un disco duro local y
reorganizando hipervínculos para crear casi una imagen espejo para la navegación local

● Descargando y almacenando con fines históricos o de archivo, o


● Almacenamiento en caché de páginas web para ahorrar tiempo de descarga superfluo en visitas repetidas al sitio web.
CGI: Ayudando a los Servidores Web a Procesar Datos del Cliente

CGI (Interfaz de Puerta Común) es una tecnología y protocolo web que define una forma
para que un servidor web (servidor HTTP) interactúe con aplicaciones externas, por ejemplo, PHP.

CGI se utiliza como una interfaz entre el servidor web y el adicionalmente instalado
aplicaciones que generan contenido web dinámico. Estas aplicaciones se llaman scripts CGI
y están escritos en diferentes guiones y lenguajes de programación como PHP, Perl, Python,
etc.

CGI permite a los programas CGI procesar formularios HTML u otros datos que provienen de los clientes,

y luego permite que los programas CGI envíen una respuesta de vuelta al cliente

.
La respuesta puede ser documentos HTML, archivos GIF, clip de video o cualquier dato que el cliente

el navegador puede ver. Esto hace que tus páginas web sean interactivas con el usuario.
Cuando un cliente solicita un documento de un servidor, el servidor encuentra el archivo y se lo envía al

cliente.
Sin embargo, si un cliente solicita un programa CGI, el servidor simplemente actúa como un intermediario

entre el cliente y el programa CGI.


¿Qué sucede cuando un cliente solicita un proceso CGI?

1. El cliente envía una solicitud al servidor que se ejecuta en su máquina. La solicitud puede ser
para un documento, o como el contenido de un formulario HTML.

Si la solicitud es para un documento regular (como un documento HTML o un archivo .GIF), el


el servidor envía ese documento directamente de vuelta al cliente.

Si la solicitud es datos destinados a una aplicación externa, entonces el servidor necesita utilizar CGI

para ejecutar esa aplicación.

Por ejemplo, la solicitud del cliente podría ser buscar en una base de datos. La aplicación CGI

toma los criterios de búsqueda, busca en la base de datos y luego envía los resultados de vuelta al cliente.
2. Cuando un servidor recibe una solicitud que debe ser manejada por una aplicación externa
una solicitud (aCGI) que el servidor crea una copia de sí mismo.

Este segundo proceso se llama proceso CGI porque es el proceso en el que el


El programa CGI se ejecutará.

El proceso CGI tiene todas las mismas rutas de comunicación que el proceso del servidor.

tiene. El único propósito del proceso CGI es establecer comunicaciones entre el


programa CGI y el servidor.
3. El programa CGI responde al cliente.

El programa CGI toma los datos que el servidor proporciona a través del entorno.
variables, entrada estándar o argumentos de línea de comandos.

Procesa los datos, contacta a los servicios externos que necesita y luego envía un
respuesta al servidor a través de las vías de datos utilizando la salida estándar.

Luego, el servidor toma la respuesta del programa y se la envía de vuelta al software del cliente.

Tu programa puede generar cualquier tipo de datos que necesite, incluyendo HTML, GIFs, o
JPEGs.
Aplicaciones CGI:
Las aplicaciones CGI que crean el HTML suelen estar escritas en uno de muchos lenguajes de programación de alto nivel.

lenguajes de programación de alto nivel que tienen la capacidad de aceptar datos del usuario, procesarlos y

devuelve HTML al servidor.

Una aplicación CGI es ligeramente diferente de un programa típico.


Las principales diferencias están en los aspectos de entrada, salida e interacción del usuario de

un programa de computadora.

Cuando un script aCGI comienza, necesita recuperar los datos del formulario proporcionados por el usuario, pero él

debe obtener estos datos del cliente web, no de un usuario en la máquina del servidor ni de una
archivo de disco.
La salida difiere en que cualquier dato enviado a la salida estándar será enviado de vuelta a la conexión.

Cliente web en lugar de la pantalla, ventana GUI o archivo en disco.

Los datos enviados de vuelta deben ser un conjunto de encabezados válidos seguidos de HTML. Si no es así, se produce un error.

ocurrirá porque los clientes web son un navegador, solo entienden datos HTTP válidos (es decir, MIME

encabezados y HTML).
Módulo cgi
Hay una clase principal en el módulo cgi, es decir, la clase FieldStorage.
Esta clase debe ser instanciada cuando un script CGI de Python comienza, ya que leerá todo el
información relevante del usuario desde el cliente web (a través del servidor web).

Una vez que este objeto ha sido instanciado, consistirá en un objeto similar a un diccionario que tiene
un conjunto de pares clave-valor. Las claves son los nombres de los elementos del formulario que se pasaron

a través del formulario mientras que los valores contienen los datos correspondientes.

Estos valores en sí mismos pueden ser uno de tres objetos. Pueden ser
Objetos FieldStorage (instancias)
MiniFieldStorage, que se utiliza en casos donde no hay subidas de archivos o formularios de múltiples partes
los datos están involucrados. Las instancias de MiniFieldStorage contienen solo el par clave-valor del nombre

y los datos.
Por último, pueden ser una lista de tales objetos. Esto ocurre cuando un formulario contiene más de

un elemento de entrada con el mismo nombre de campo.

Para formularios web simples, generalmente encontrarás todas las instancias de MiniFieldStorage.
Construcción de aplicaciones CGI:
1. Configuración de un servidor web

2. Creando la Página del Formulario

3. Generando la Página de Resultados

4. Sitios web totalmente interactivos

1. Configuración de un servidor web:

Para trabajar con el desarrollo CGI en Python, primero necesitas instalar un servidor web.

configúralo para manejar solicitudes PythonCGI, y luego da acceso al servidor web a


tus scripts CGI.

Si quieres un servidor web real, probablemente descargarás e instalarás Apache. Hay


Complementos o módulos de Apache para manejar Python CGI.
Si solo quieres iniciar el servidor web más básico, simplemente ejecútalo directamente con Python:
$ python -m CGIHTTPServer

Esto iniciará un servidor web en el puerto 8000 en tu máquina actual desde el actual
directorio. Luego puedes crear un Cgi-bin justo debajo del directorio desde el cual tú
inició el servidor y colocó sus scripts CGI de Python allí.

Coloca algunos archivos HTML en ese directorio y quizás algunos scripts CGI .py en Cgi-bin, y tú
están listos para "navegar" directamente a este sitio web con direcciones que se parecen a algo como esto:

[Link]
[Link]
2. Creando la Página del Formulario

Este archivo HTML ([Link]) presenta un formulario al usuario con un campo vacío para el
nombre del usuario y un conjunto de botones de radio para que el usuario elija.
1 <HTML><HEAD><TITLE> Como puedes ver en el código,
2 Amigos Demostración CGI (pantalla estática) el formulario contiene dos entradas

3 </TÍTULO></CABECERA> variables: person and how


4 <BODY><H3>Lista de amigos para: <I>NUEVO USUARIO</I></H3>
muchos. Los valores de estos dos
5 <FORM ACTION="/cgi-bin/[Link]">
los campos serán pasados a nuestro
6 <B>Introduce tu Nombre:</B>
script CGI, [Link].
7 <INPUT TYPE=text NAME=personVALUE="NEW USER" SIZE=15>
<P><B>¿Cuántos amigos tienes?</B>
9 <INPUT TYPE=radio NAME=howmanyVALUE="0" CHECKED> 0
10 <INPUT TYPE=radio NAME=howmanyVALUE="10"> 10
11 <INPUT TYPE=radio NAME=howmanyVALUE="25"> 25
12 <INPUT TYPE=radio NAME=howmanyVALUE="50"> 50
13 <INPUT TYPE=radio NAME=howmany VALUE="100"> 100
14 <P><INPUT TYPE=submit></FORM></BODY></HTML>
[Link] en un cliente
Página de amigos en IE6 en Win32 ([Link])
3. Generando la Página de Resultados:
La entrada es ingresada por el usuario y se presiona el botón 'Enviar'.
Cuando esto ocurre, el script en [Link] se ejecuta a través de CGI.
Este script CGI obtiene la persona y cuántos campos del formulario y utiliza esos datos.
para crear la pantalla de resultados generados dinámicamente.
1 #!/usr/bin/env python([Link])
2
3import cgi
4
5 reshtml = '''Tipo de contenido: text/html\n
6 <HTML><HEAD><TITLE>
Demostración CGI de 7 Amigos (pantalla dinámica)
8 </TÍTULO></CABECERA>
9 <BODY><H3>Lista de amigos para: <I>%s</I></H3>
Tu nombre es: <B>%s</B><P>
Tienes <B>%s</B> amigos.
12 </CUERPO></HTML>'''
13
14 formulario = [Link]()
15 quién = form['persona'].valor
16 cuántos = formulario['cuántos'].valor
17imprimir reshtml % (quién, quién, cuántos)
Este script contiene todo el poder de programación para leer la entrada del formulario y procesarla, como

bueno, como devolver la página HTML resultante al usuario.


suponiendo que el usuario escribió "erick allen" como el nombre y hizo clic en el botón de opción "10 amigos"

botón.
4. Sitios web totalmente interactivos:

Un usuario ingresa su información desde la página del formulario. Luego procesamos los datos y
salida de una página de resultados.

Ahora, añadiremos un enlace a la página de resultados que permitirá al usuario volver al formulario.
página, pero en lugar de presentar un formulario en blanco, llenaremos los datos que el usuario ha

ya proporcionado.
CGI Avanzado
Estos CGI avanzados incluyen el uso de cookies, datos en caché guardados en el lado del cliente.

multiple values for the same CGI field and file upload using multipart form submissions.
Using Cookies in CGI
Para un sitio web comercial, se requiere mantener la información de la sesión entre diferentes
páginas.

Por ejemplo, un registro de usuario termina después de completar muchas páginas. Cómo mantener
información de la sesión del usuario a través de todas las páginas web?

In many situations,using cookiesis the mostefficient method of remembering and


seguimiento de preferencias, compras, comisiones y otra información requerida para una mejor
experiencia del visitante o estadísticas del sitio.
¿Cómo funciona?
Cuando el servidor envía algunos datos al navegador del visitante en forma de una cookie. El navegador

puede aceptar la cookie. Si lo hace, se almacena como un registro de texto plano en el disco duro del visitante

conducir.
Ahora, cuando el visitante llega a otra página en su sitio, la cookie está disponible para
recuperación. Una vez recuperado, su servidor sabe/recuerda lo que se almacenó.
Las cookies son un registro de datos en texto plano de 5 campos de longitud variable -

Caduca− La fecha en que la cookie expirará. Si está en blanco, la cookie expirará cuando el
el visitante cierra el navegador.

Domain− The domain name of your site.


Ruta− La ruta al directorio o página web que establece la cookie. Esto puede estar en blanco si tú
quiero recuperar la cookie de cualquier directorio o página.
Seguro− Si este campo contiene la palabra 'seguro', entonces la cookie solo puede ser recuperada con
un servidor seguro. Si este campo está en blanco, no existe tal restricción.

Name=Value− Cookies are set and retrieved in the form of key and value pairs.
Configuración de Cookies

Es muy fácil enviar cookies al navegador. Estas cookies se envían junto con HTTP.
Encabezado antes del campo Content-type. Suponiendo que deseas establecer UserID y Password como

galletas.
La configuración de las cookies se realiza de la siguiente manera −

Usamos el encabezado HTTP Set-Cookie para establecer cookies.

It is optional to set cookies attributes like Expires, Domain, and Path.


Es notable que las cookies se establecen antes de la línea "Content-type:text/html .
Recuperando cookies:
Es muy fácil recuperar todas las cookies establecidas. Las cookies se almacenan en el entorno CGI.

variableHTTP_COOKIEy tendrán la siguiente forma −


key1 = value1;key2 = value2;key3 = value3....
Aquí hay un ejemplo de cómo recuperar cookies.

Esto produce el siguiente resultado para las cookies establecidas por el script anterior -

User ID = XYZ
Password = XYZ123
File Upload:
Para subir un archivo, el formulario HTML debe tener el atributo enctype establecido en multipart/form-data.

La etiqueta de entrada con el tipo de archivo crea un botón de 'Explorar'.


Aquí está el scriptsave_file.py para manejar la carga de archivos −
Campos multivaluados:
cómo procesar campos con múltiples valores.
cuando tienes un conjunto de casillas de verificación que permiten a un usuario seleccionar entre varias opciones.

Cada una de las casillas de verificación está etiquetada con el mismo nombre de campo, pero para diferenciarlas,

cada uno tendrá un valor diferente asociado con una casilla de verificación en particular.

Como sabes, los datos del usuario se envían al servidor en pares clave-valor durante
envío del formulario.

Cuando se envían más de una casilla de verificación, tendrás múltiples valores.

associated with thesame key. In these cases, rather than being given a single
Instancia MiniFieldStorage para tus datos, el módulo cgi creará una lista de tales.
instancias que iterarás para obtener los diferentes valores.
Servidores Web (HTTP):
Un servidor web HTTP no es más que un proceso que se está ejecutando en tu máquina y hace
exactamente dos cosas:
1- Escucha solicitudes http entrantes en una dirección de socket TCP específica (dirección IP

y un número de puerto)
2- Maneja esta solicitud y envía una respuesta de vuelta al usuario.

Creando servidores web en Python:


En Python 2, para crear un servidor web, se requiere un servidor base y un 'manejador'.

El servidor Thebase (Web) es un elemento básico, imprescindible. Su función es realizar el


comunicación HTTP necesaria entre el cliente y el servidor.
La clase base del servidor se llama (apropiadamente) HTTPServer y se encuentra en el

Módulo BaseHTTPServer.
El controlador es la parte del software que realiza la mayor parte de la "servidumbre web."

Procesa la solicitud del cliente y devuelve el archivo apropiado, ya sea estático o


generado dinámicamente por CGI.
La complejidad del manejador determina la complejidad de su servidor web.
La biblioteca estándar de Python proporciona tres controladores diferentes:

1. BaseHTTPRequestHandler se encuentra en el módulo BaseHTTPServer, junto con

el servidor Web base.

2. El SimpleHTTPRequestHandler, disponible en el módulo SimpleHTTP-Server,

construye sobre BaseHTTPRequestHandler implementando el estándar GET y

HEADsolicitudes.

3. Finalmente, tenemos el CGIHTTPRequestHandler, disponible en el CGIHTTPServer

módulo, que toma el SimpleHTTPRequestHandler y agrega soporte para POST

requests. Tiene la capacidad de llamar a scripts CGI para realizar el procesamiento solicitado y

puede enviar el HTML generado de vuelta al cliente.


Web Server Modules and Classes:

Module Descripción

1. BaseHTTPServer Proporciona las clases base del servidor web y del controlador base.

HTTPServer y BaseHTTPRequestHandler, respectivamente.

2. ServidorHTTPSimple Contiene la clase SimpleHTTPRequestHandler para realizar


Solicitudes GET y HEAD.

3. CGIHTTPServer Contiene la clase CGIHTTPRequestHandler para procesar


Solicitudes POST y ejecución de CGI
Para crear un servidor web en Python 3, necesitarás importar dos
módulos:[Link] y socketserver.

En Python 2, había un módulo llamado SimpleHTTPServer. Este módulo ha sido


integrado en [Link] en Python 3.

Mencioné anteriormente, primero un servidor web es un proceso que escucha las solicitudes entrantes en

Dirección TCP específica. La dirección TCP se identifica por una dirección IP y un número de puerto.

En segundo lugar, también se le debe indicar a un servidor web cómo manejar las solicitudes entrantes.

Estas solicitudes entrantes son manejadas por controladores especiales. Puedes pensar en una web

el servidor como un despachador, llega una solicitud, el servidor http inspecciona la solicitud y

lo envía a un manejador designado.


Ej: Creando un servidor web
import [Link]
importar socketserver
PORT = 8080
Manejador = [Link]
con [Link](("", PUERTO), Controlador) como httpd:
print("sirviendo en el puerto", PORT)

httpd.serve_forever()

[Link] es: un manejador de solicitudes HTTP simple que


sirve archivos desde el directorio actual y cualquiera de sus subdirectorios.

[Link]: Una instancia de TCPServer describe un servidor que


utiliza el protocolo TCP para enviar y recibir mensajes.
Para instanciar un servidor TCP, necesitamos dos cosas:

1- La dirección TCP (dirección IP y un número de puerto)

2- El manejador
[Link](('', PORT), Handler)

La dirección TCP se pasa como una tupla de (dirección IP, número de puerto)

Estamos pasando una cadena vacía como dirección IP, lo que significa que el servidor estará escuchando.

en cualquier interfaz de red (todas las direcciones IP disponibles).

Handler es [Link]

PORTstores the value of 8080, then the server will be listening on incoming requests on
ese puerto.

Serve_forever es un método en la instancia TCPServer que inicia el servidor y comienza


escuchando y respondiendo a las solicitudes entrantes.
guarda este archivo como [Link] en el mismo directorio que [Link]
<html>
<cabeza>
<title>Python is awesome!</title>
</head>
<cuerpo>
<h1>Afternerd</h1>
<p>¡Felicidades! ¡El servidor HTTP está funcionando!</p>
</cuerpo>
</html>
En ese directorio, inicia el servidor web:
$ python [Link]
servidor en el puerto 8080

Ahora tenemos un servidor HTTP que está escuchando en cualquier interfaz en el puerto 8080 esperando por

solicitudes http entrantes.


Abre tu navegador y escribe localhost:8080 en la barra de direcciones.

También podría gustarte