Categorías
Python

Descubrir Frasco, Parte 2 – Creación de una página de entrada

 

Tabla de contenidos Aplicaciones

  • Web
  • Google App EngineDownload
  • Descargar
  • Solicitud-Respuesta
  • estática Web AppProject SetupYAML ConfigSanity Comprueba! WSGI ApplicationSanity Check (tomar dos)! Configuración
  • Proyecto

  • YAML de configuración
  • cordura Comprueba!
  • WSGI Aplicación
  • cordura Check (tomar dos)!
  • Ejercicios de repaso
  • Web AppSanity de control dinámicas (tomar tres)! Escapar Formulario de Registro InputSanity (tomar de cuatro)!
  • cordura Check (tomar tres)!
  • Formulario Escapar de entrada
  • cordura Check (tomar de cuatro)!
  • Temperatura ConverterSanity Check (tener cinco) Ejercicios de repaso:
  • cordura Check (tener cinco)!
  • Ejercicios de repaso:
  • AssignmentThe poeta ganancias de una presencia web
  • El poeta adquiere una presencia en la web
  • despliegue
  • Descargar Configuración del Proyecto
  • YAML de configuración
  • cordura Comprueba!
  • WSGI Aplicación
  • cordura Check (tomar dos)!
  • cordura Check (tomar tres)!
  • Formulario Escapar de entrada
  • cordura Check (tomar de cuatro)!
  • cordura Check (tener cinco)!
  • Ejercicios de repaso:
  • Las ganancias poeta una presencia en la web

este tutorial explora cómo crear aplicaciones web dinámicas con Python. Fue publicado originalmente en Curso Python real 1: Introducción a Python:

Muestra gratuito: Haga clic aquí para obtener acceso a un capítulo de la muestra libre de la real Python curso que muestra cómo el trabajo con el curso y cómo se va ayuda a obtener habilidades prácticas de programación Python. Aplicaciones Web

Usted sabe cómo escribir scripts útiles Python, y ahora quiere mostrarlas al mundo … pero ¿cómo? La mayoría de los no programadores no tendrán ningún uso para los archivos de script .py . Programas como PyInstaller y ayuda cx_Freeze convierten scripts de Python en los programas ejecutables que se ejecutan por sí mismos en diferentes plataformas sin la necesidad de utilizar Python para interpretar el código. Cada vez más, sin embargo, estamos viendo una tendencia a alejarse de aplicaciones basadas en “Escritorio” y hacia las aplicaciones web que se puede acceder y ejecutan a través de los navegadores de Internet.

Históricamente, sitios web en Internet estaban llenos de páginas de civil que ofrecían exactamente la misma información a todos los usuarios; usted solicitar una página, y la información de esa página se mostraría. Estas páginas fueron “estática” porque su contenido nunca cambia; un servidor web simplemente responder a la petición de un usuario de una página web mediante el envío a lo largo de esa página, independientemente de que el usuario estaba o qué otras acciones se llevó el usuario.

Hoy en día, la mayoría de los sitios web son en realidad las aplicaciones web, que ofrecen “dinámicas” páginas que pueden cambiar su contenido en cualquier número de maneras. Por ejemplo, una aplicación de correo web permite al usuario interactuar con ella, mostrando todo tipo de información diferente, a menudo durante su estancia en una sola página web.

La idea detrás de la creación de una aplicación web impulsada por el pitón es que se puede utilizar el código Python para determinar qué contenido para mostrar un usuario y qué acciones tomar. El código es en realidad dirigido por el servidor web que aloja su sitio web, por lo que su usuario no necesita instalar nada para utilizar su aplicación; si el usuario tiene un navegador y una conexión a Internet, entonces todo lo demás se llevará a cabo en línea.

Google App Engine

La tarea de conseguir el código Python para ejecutar en un sitio web es un tema complejo, pero hay un número de diferentes marcos web disponible para Python que toma automáticamente el cuidado de los detalles.

Lo primero que se necesita es un plan de alojamiento web que permite y apoya la posibilidad de ejecutar código Python. Ya que estos por lo general cuestan dinero (y ya que no todo el mundo tiene incluso una página web), vamos a seguir con una alternativa libre que es uno de los más sencillos de configurar: Google App Engine, que utiliza un marco web llamado webapp2.

Hay una serie de otras alternativas (tanto gratuitos como de pago) que son más personalizable, y se puede utilizar webapp2 por sí solo más tarde sin depender de Google App Engine, pero empezar con Google App Engine será la forma más rápida y fácil para comenzar a aprender sobre el desarrollo de aplicaciones web en Python.

Descargar

En primer lugar, haz clic aquí para descargar e instalar el SDK Python apropiado (Software Development Kit) para Google App Engine. Este SDK particular incluye dos recursos principales: una aplicación “servidor web”, lo que le permitirá ejecutar las aplicaciones web en su propio ordenador sin tener que ponerlos en línea, y el Google App Engine Launcher, que le ayudará a conseguir sus aplicaciones web en línea .

NOTA : Desafortunadamente, Google App Engine sólo funciona con Python 2.7 y no tiene planes inmediatos para apoyar a Python 3 Código.

Solicitud-Respuesta

Antes de sumergirse en la escritura de una aplicación web, vamos a obtener una visión muy amplia y generalizada de lo que está a punto de suceder. Hay un montón de diferentes piezas involucradas, y todos ellos tienen que comunicarse entre sí para funcionar correctamente:

estática aplicación web de

La aplicación que vamos a crear va a depender de un par de diferentes archivos, por lo que lo primero que tenemos necesidad de hacer es hacer una carpeta de proyecto para contener todos estos archivos. Configuración

Proyecto

Crear una nueva carpeta llamada “first_app” en cualquier lugar te gusta (sólo recuerda donde está). En primer lugar vamos a escribir una muy simple script en Python que puede “responder” con el contenido de su página web:

print "Content-Type: text/plain"
print ""
print "Congratulations, it's a web app!"

Guardar este código en un script llamado hello.py dentro de la carpeta “first_app”.

Entonces, ¿qué pasa con las dos primeras sentencias de impresión? servidores Web se comunican con los usuarios (por lo general los navegadores) a través de HTTP mediante la recepción de las peticiones HTTP y el envío de las respuestas HTTP. La respuesta HTTP que nuestra aplicación envía puede tener dos líneas de cabecera y un cuerpo.

Hemos añadido una línea de cabecera de nuestra respuesta HTTP en la primera línea. líneas de cabecera contienen información opcional que permite que un navegador sabe cómo interpretar el cuerpo de la respuesta. En este caso, el establecimiento de nuestra cabecera Content-Type igual a la de texto de valor / plain es la forma en que nuestra respuesta HTTP permite un saber navegador para esperar que el cuerpo contiene texto plano en lugar de código HTML, una imagen, o algún otro tipo de archivo. Dejando una línea en blanco después de esta línea de cabecera es la forma en que dice el navegador, “las líneas de cabecera han terminado; aquí viene el cuerpo real para mostrar “.

El cuerpo de la respuesta es lo que realmente veremos cuando cargamos la página en un navegador. En este caso, es sólo una simple cadena de texto: “Felicidades, es una aplicación web!”

YAML de configuración

Antes de poder ejecutar nuestra aplicación web, tenemos que proporcionar App Engine con un archivo de configuración. Este es el archivo que el servidor web utilizará para obtener información acerca del código Python que queremos que se ejecute. Abra cualquier editor de texto y copie el texto siguiente en un nuevo archivo:

application: hello
version: 1
runtime: python27
api_version: 1
threadsafe: false
handlers:
- url: /.*
script: hello.py

Ahora nombrar este archivo app.yaml y guardarlo en la misma carpeta “first_app” como la secuencia de comandos de Python.

NOTA : asegúrese de que obtener el espacio correcto; la última línea incluye dos espacios a la izquierda de modo que “escritura” se alinea bajo “URL”. Al igual que Python, archivos YAML dependen de muesca precisa. archivo de configuración

El YAML da App Engine toda la información necesaria que necesita para ejecutar la aplicación Web:

cordura Comprueba!

Bien, ahora por fin podemos echar un vistazo a nuestra aplicación!

Todavía no está en línea, pero podemos ver que mediante la ejecución de la solicitud a través de nuestro propio servidor web “local” (que no se puede acceder por otros usuarios) a través de Google App Engine. Esto ayudará a simular lo que las cosas se ven como a un usuario una vez que nuestra aplicación está en línea.

Abrir el programa del motor de Google App Launcher, a continuación, seleccione Archivo -> Añadir aplicación existente … A continuación, puede buscar y seleccionar la carpeta de “first_app” que contiene la aplicación web. Añadir la aplicación a través del puerto 8080, seleccione la aplicación en la ventana principal y haga clic en el botón verde “Run”.

NOTA: Los usuarios de Linux – que tendrán que desplazarse en su terminal al directorio justo antes de la carpeta “first_app” (es decir, su directorio padre), a continuación, escriba el siguiente comando para iniciar la aplicación web (que se ejecutará en el puerto 8080 de forma predeterminada): google_appengine / dev_appserver.py first_app /

La ventana de la consola que aparece hará un seguimiento de una gran cantidad de información adicional, pero su aplicación web funciona correctamente una vez que vea un cursor parpadeante.

El número “puerto” puede ser pensado como la selección de un canal en particular para el uso, similar a la transmisión de un canal de televisión o radio. Elegimos para ejecutar la aplicación web en el puerto 8080, lo que significa que el usuario puede esencialmente “sintonizar” a este número de puerto y recibir la comunicación de nuestro servidor web. (Podríamos anfitrión de una aplicación web completamente diferente utilizando un número de puerto diferente y los dos no puedan interferir con la otra.)

Una vez que la aplicación web se está ejecutando (esto puede tomar un poco de tiempo), podemos hacer clic en “Examinar” a la vista la aplicación web en el navegador web por defecto. Esto abrirá la página de la URL “localhost: 8080” (que también podemos escribir en un navegador manualmente para cargar la aplicación web). La dirección web “localhost” es sólo una manera de decir “la dirección web de mi propio ordenador” (ya que la aplicación no es en realidad en línea todavía). Las “: 8080” especifica que debemos escuchar para la comunicación en el puerto número 8080.

Si todo se ha configurado correctamente, su navegador debe cargar una página que muestra el texto sin formato: Enhorabuena, es una aplicación web!

NOTA : Si realiza algún cambio en la secuencia de comandos, siempre y cuando Google App Engine Launcher aún se ejecuta la aplicación, todo lo que tiene que hacer con el fin de obtener la última versión de la aplicación web es para guardar el script y volver a cargar la página web. App Engine escuchará automáticamente según los cambios que podrían haber sido hechas.

WSGI Aplicación

Bueno, eso es un comienzo. En cuanto a una “solicitud” se va, sin embargo, la secuencia de comandos de Python implicada era bastante inútil. Con el fin de hacer algo con un poco más potencial, tenemos que crear un objeto especial en nuestro código Python llamado WSGIApplication. WSGI significa Gateway Interface Web Server y es una manera de permitir Python para comunicarse con el servidor web de una manera mejor que simplemente “imprimir” un solo trozo de vuelta la información como respuesta.

Nuestro nuevo script en Python, que todavía sólo muestra la misma línea de texto, es considerablemente más complicado:

import webapp2

class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers["Content-Type"] = "text/plain"
self.response.write("Congratulations, it's a web app!")

routes = [('/', MainPage)]

my_app = webapp2.WSGIApplication(routes, debug=True)

Ahora tenía que webapp2 importación con el fin de WSGI uso. En la última línea de nuestro script, estamos utilizando el marco webapp2 web para crear un objeto denominado my_app WSGIApplication que permitirá a nuestro código para comunicarse con el servidor web.

Esta vez estamos creando una nueva clase usando la palabra clave “clase”; Esto significa que MainPage es un nuevo tipo de objeto (específicamente, un tipo de objeto webapp2.RequestHandler) que puede tener sus propios métodos y atributos al igual que cualquier otro objeto.

A pesar de que parece que el método get () toma un argumento del “yo”, esta palabra clave especial se crea y se utiliza internamente por el nuevo objeto como una manera de hacer un seguimiento de forma automática. Tenemos que utilizar esta palabra clave “auto” dentro de un nuevo objeto que hemos definido, debido a que el objeto necesita saber cuando se está refiriendo a sus propios métodos y atributos. Por ejemplo, tenemos que llamar self.response con el fin de acceder a la respuesta almacenada en nuestro objeto MainPage RequestHandler. Para una mirada más profunda en cómo hacer y utilizar una clase de Python, el pago y envío ‘POO Apéndice’ en Curso Python real 1. O puede que desee echar un vistazo a la Introducción de Codecademy a clases y mi proyecto de la práctica de acompañamiento.

como primer argumento de nuestra WSGIApplication, se aprobó una lista de tuplas llamadas rutas. En este caso, sólo las rutas contiene una tupla, ( ‘/’, MainPage). Esta “ruta” dice nuestra aplicación WSGI que cualquier persona que acceda al directorio principal de nuestra aplicación debe conseguir dirigido a MainPage. Llamamos a MainPage un “controlador de solicitudes”, ya que se encarga de manejar las solicitudes de los usuarios para esa página web en particular.

El “/” es cómo se representa el principal directorio “raíz” de nuestra aplicación (es decir, nuestro sitio web). Si hubiéramos proporcionado una segunda tupla, ( ‘/ images /’, InicioÚltimas imágenes), entonces cualquier persona que acceda a la (hipotética) de directorio “imágenes” de nuestra página web se dirige a la clase InicioÚltimas imágenes en la secuencia de comandos de Python.

Si hacemos un error en el código, depuración de nuestra aplicación = true argumento nos permitirá ver los reportados por los errores de Python en nuestra aplicación web; de lo contrario, todo lo que veríamos es un mensaje “500 Error interno del servidor”.

Debido a la forma en que definimos rutas, cuando nuestro servidor web recibe una petición para cargar la página “/”, webapp2 crea un nuevo objeto MainPage (llamado un controlador de solicitudes porque responde a la solicitud de una página web). El método get () de MainPage se llama automáticamente cuando se crea, que es como nuestros responde WSGIApplication al servidor web.

La respuesta está escrita con estas dos líneas:

self.response.headers["Content-Type"] = "text/plain"
self.response.write("Congratulations, it's a web app!")

Una vez más, tenemos que escribir tanto una línea de cabecera y un cuerpo. La línea de cabecera se llena en cabeceras como en un diccionario, estableciendo el valor de la Content-Type igual a text / plain. Esta vez, creemos en el cuerpo de la respuesta usando el método write (). WSGI se encarga de separar las líneas de cabecera desde el cuerpo, así que esta vez no hay necesidad de escribir () una línea en blanco en primer lugar.

Ahora tenemos que actualizar nuestro archivo de configuración YAML así:

application: hello
version: 1
runtime: python27
api_version: 1
threadsafe: false
handlers:
- url: /.*
script: hello.my_app

La única diferencia con el archivo de configuración anterior es la última línea, donde destacamos el “guión” de usar hello.my_app en lugar de hello.py ; en lugar de toda la secuencia de comandos de Python, ahora queremos el servidor web para ejecutar el WSGIApplication objeto dentro de nuestro script llamado my_app, que accedemos utilizando el sencillo método de notación de puntos hello.my_app . (No hay ningún nuevo archivo llamado hello.my_app – sólo estamos señalando nuestro archivo de configuración para el objeto my_app dentro de la secuencia de comandos hello.py .)

cordura Check (tomar dos)!

Si todo va bien, ahora debería ser capaz de salvar a estos dos archivos, vuelva a cargar la página web, y ver exactamente lo mismo que antes: Felicidades, es una aplicación web!

NOTA : Si comete un error en la secuencia de comandos de Python, su aplicación web puede cargar una página de error terrible que hace que parezca como si se rompió Internet para siempre. No se asuste! Basta con mirar a la última línea, que le apunte al error específico (por lo general una línea de código aparece en rojo) que causó toda la cadena de fracaso.

Si lo hace terminar con un error que su navegador se niega a darle más consejos sobre (en vez mostrando un “error 500 de servidor interno”, aun cuando se ha establecido su WSGIApplication tener debug = true), puede intentar ejecutar la secuencia de comandos de Python sí en IDLE. A pesar de que no se ejecutará (porque Python no será capaz de encontrar el módulo webapp2), IDLE todavía puede señalar si su código tiene errores de sintaxis.

Ejercicios de repaso

dinámico aplicación web de

Ahora que hemos actualizado nuestra aplicación web para su uso WSGI, podemos crear múltiples páginas que interactúan con el usuario. Vamos a empezar por la creación de un formulario HTML que toma algo de la entrada de texto por parte del usuario y muestra que en ese texto en una página nueva:

Con el fin de hacer esto, es necesario incluir dos tuplas en nuestras rutas:

routes = [('/', MainPage), ('/welcome', Greeting)]

nos don ‘t necesidad de actualizar el archivo de configuración, porque todavía queremos cualquier solicitud de una página web para ser dirigido a nuestra my_app objeto WSGIApplication dentro de la secuencia de comandos hello.py . A partir de ahí, my_app es responsable de dirigir las peticiones de páginas web para el correcto “controlador de solicitudes” – ya sea MainPage o saludo.

Nuestro código de la aplicación web completa se verá así:

import webapp2

class MainPage(webapp2.RequestHandler):
def get(self):
self.response.headers["Content-Type"] = "text/html"
self.response.write("""

Enter your name...<itle></head><br /> <body></p> <form action="/welcome" method="post"> <input type="text" name="my_name"><br /> <input type="submit" value="Sign In"><br /> </form> <p> </body><br /> </html>""")</p> <p>class Greeting(webapp2.RequestHandler):<br /> def post(self):<br /> username = self.request.get("my_name")<br /> welcome_string = """<html><body><br /> Hi there, {}!<br /> </body></html>""".format(username)<br /> self.response.headers["Content-Type"] = "text/html"<br /> self.response.write(welcome_string)</p> <p>routes = [('/', MainPage), ('/welcome', Greeting)]<br /> my_app = webapp2.WSGIApplication(routes, debug=True)<br /> </code> </p> <p> Esta vez, especificamos el tipo de contenido para ser text / html porque estamos escribiendo páginas en código HTML. Lo hicimos uso de cadenas multilínea, aunque también podríamos haber roto el contenido en múltiples comandos () de escritura. </p> <p> Al igual que antes, nuestra página principal (manejado por la solicitud MainPage manejador) tiene un método get () de manera que pueda responder a las solicitudes a “obtener” la información. En el cuerpo del contenido, incluimos el título de nuestra página web y una forma sencilla. Nuestra forma tiene un único campo de entrada de texto llamado mi_nombre y un botón “Iniciar sesión” submit. Cuando un usuario hace clic en el “Sign In” botón, nuestros puestos de formulario sus datos (es decir, el valor de mi_nombre) a la página web ubicada en “/ bienvenida”. </p> <p> Mientras tanto, nuestro “/ bienvenida” página (manejado por el controlador de solicitudes de felicitación) tiene un método post () para que pueda responder cuando recibe “escrito” de datos. Podríamos tener que acostumbrarse () para enviar los datos del usuario (y lo haremos en el siguiente ejemplo), pero la información que se envía utilizando get () se convierte en una parte de la URL; esto se convertiría en un problema si más tarde decidimos que queremos que el usuario incluir información sensible (como una contraseña). </p> <p> Dentro post (), que utiliza self.request.get ( «mi_nombre») para obtener el valor suministrado por el usuario de mi_nombre de “post” la petición del usuario, que almacena en una variable de cadena llamado nombre de usuario. Entonces creamos un welcome_string, que es una cadena de múltiples líneas que representa el código HTML completo para nuestra página “/ bienvenida”, incluyendo el valor introducido del nombre de usuario. Como antes, a continuación, escribir () fuera de la línea de cabecera y el cuerpo de contenido para mostrar la página web resultante. </p> <h3> cordura Check (tomar tres)! </h3> <p> Guardar la secuencia de comandos y volver a cargar el navegador para ver su nueva aplicación web. Observe cómo, cuando “Iniciar sesión” a la aplicación web, se le dirigirá a la nueva página web “localhost: 8080 / bienvenida” – que esperemos que aparezca de nuevo lo que ha escrito! </p> <h3> Formulario Escapar de entrada </h3> <p> En realidad, hay un cambio importante que tenemos que hacer en nuestro código. El hecho de que tomamos entrada de un usuario y la pantalla que volver de entrada sin primero investigando lo que estamos a punto de la pantalla es un enorme agujero de seguridad. Claro, tal vez usted no esperar a tener los usuarios malintencionados que están tratando activamente para romper su aplicación, pero nunca se debe subestimar el potencial para los usuarios hacer cosas inesperadas que hacen que su aplicación a romper de forma inesperada. </p> <p> Por ejemplo, tal vez alguien decide que un nombre de usuario adecuado para entrar en nuestra aplicación es <b>. Nuestros “/” bienvenida extremos de páginas web hasta que muestra: </p> <p> <code>Hi there, !<br /> </code> </p> <p> ya que estamos insertando este texto en código HTML, el <b> fue interpretado como una etiqueta HTML para empezar a hacer el texto en negrita – así que en vez de saludar a nuestro usuario, sólo el cambio nuestro punto de explicación que se mostrará en negrita. (Se puede imaginar cómo esto podría presentar un problema de seguridad;. Cualquier usuario puede escribir código ahora que se ejecuta en nuestro servidor web) </p> <p> Para evitar esto, podemos utilizar la función de Python incorporada cgi.escape (), que convierte el especial caracteres HTML <, >, y en representaciones y equivalentes que se pueden visualizar correctamente. Primero tendrá que cgi importación en la secuencia de comandos de Python para utilizar esta funcionalidad. Entonces, cuando llegue () el valor de mi_nombre de la solicitud del usuario, puede convertir todos los caracteres HTML especiales por vez diciendo: </p> <p> <code>username = cgi.escape(self.request.get("my_name"))<br /> </code> </p> <h3> cordura Check (tomar de cuatro)! </h3> <p> Con estos cambios, intente volver a ejecutar la aplicación web y la firma de un nombre de usuario de <b> de nuevo. Ahora debería ver que muestra la parte trasera nombre de usuario para que correctamente: </p> <p> <code>Hi there, <b>!<br /> </code> </p> <h2> Temperatura Convertidor </h2> <p> bien, así que ahora podemos crear una página web que ayuda al usuario “post” de datos a otra página web interactiva. ¿Qué acerca del uso del método get () para hacer una sola página interactiva? Echemos un vistazo a un ejemplo con apenas un poco más de código Python detrás de él y volver a visitar el guión “temperatura del convertidor” que escribimos vuelta camino en los <em> Funciones y Loops </em> capítulo y otra vez como una aplicación de interfaz gráfica de usuario simple en el <em> interfaz gráfica de </em> usuario capítulo en el real Python Curso 1. </p> <p> la página web que desea mostrar tendrá un campo de texto simple en la entrada del usuario lata una temperatura en grados Celsius. También vamos a incluir un botón “Convertir” para convertir Celsius de temperatura suministrado del usuario en grados Fahrenheit. Este resultado convertido se mostrará en la siguiente línea y se actualizará cada vez que el usuario hace clic en el botón “Convertir”. </p> <p> El HTML de esta página, con el lugar de los titulares de los valores reales de temperatura, se verá así: </p> <p> <code><html><br /> <head><title>Temperature Converter<itle></head><br /> <body></p> <form action="/" method="get"> Celsius temperature: <input type="text" name="cel_temp" value={}><br /> <input type="submit" value="Convert"><br /> Fahrenheit temperature: {}<br /> </form> <p> </body><br /> </html><br /> </code> </p> <p> Esta vez, nuestro formulario utiliza el método get () con una forma de “acción” que apunta a la página principal sí mismo. En otras palabras, cuando las somete usuario de este formulario haciendo clic en el botón “Convertir”, en lugar de enviar un “mensaje” solicitud de una nueva página web, el usuario enviará una petición “obtener” de la misma página, proporcionando a la página con algunos datos de entrada. </p> <p> Al igual que hicimos antes, nos va a querer poner la conversión de la temperatura en función de su propia. </p> <p> El código completo se verá de la siguiente manera: </p> <p> <code>import webapp2</p> <p>def convert_temp(cel_temp):<br /> ''' convert Celsius temperature to Fahrenheit temperature '''<br /> if cel_temp == "":<br /> return ""<br /> try:<br /> far_temp = float(cel_temp) * 9 / 5 + 32<br /> far_temp = round(far_temp, 3) # round to three decimal places<br /> return str(far_temp)<br /> except ValueError: # user entered non-numeric temperature<br /> return "invalid input"</p> <p>class MainPage(webapp2.RequestHandler):<br /> def get(self):<br /> cel_temp = self.request.get("cel_temp")<br /> far_temp = convert_temp(cel_temp)<br /> self.response.headers["Content-Type"] = "text/html"<br /> self.response.write("""<br /> <html><br /> <head><title>Temperature Converter<itle></head><br /> <body></p> <form action="/" method="get"> Celsius temperature: <input type="text" name="cel_temp" value={}><br /> <input type="submit" value="Convert"><br /> Fahrenheit temperature: {}<br /> </form> <p> </body><br /> </html>""".format(cel_temp, far_temp))</p> <p>routes = [('/', MainPage)]</p> <p>my_app = webapp2.WSGIApplication(routes, debug=True)<br /> </code> </p> <p> Al igual que antes, nuestros convert_temp () función comprueba para ver si el usuario suministra un valor válido. Ya que el usuario no va a haber suministrado ningún valor cuando la página se carga por primera (y que no quieren empezar diciendo “entrada no válida”), comprobamos por primera vez para esta condición y devolver una cadena vacía si el campo de texto es también blanco. </p> <p> Se utilizó self.request.get ( «cel_temp») para obtener el valor suministrado por el usuario de cel_temp de la petición del usuario “get” (tal como lo hicimos para el “post” la petición del usuario en el ejemplo anterior). El código HTML que escribimos () como una cadena de múltiples líneas incluye ahora dos valores suministrados por el usuario: el cel_temp, que es el valor que el usuario entró en el campo de texto, y el far_temp, que es el resultado calculado devuelto por nuestra función. Si no hubiéramos escrito el valor de cel_temp en el cuadro de texto, entonces este cuadro de entrada se borra cuando el usuario hace clic en el botón. </p> <p> Guardar este script como <em> temperature.py </em> en la misma carpeta “first_app”, a continuación, actualizar el archivo de configuración <em> app.yaml </em> en consecuencia. Dado que cambiamos el nombre de nuestro script, cambiamos el nombre del módulo en el que el objeto my_app WSGIApplication debe cargarse: </p> <p> <code>application: temperature-converter<br /> version: 1<br /> runtime: python27<br /> api_version: 1<br /> threadsafe: false<br /> handlers:<br /> - url: /.*<br /> script: temperature.my_app<br /> </code> </p> <p> También actualizamos el nombre de la aplicación sólo para proporcionar un nombre descriptivo para lo que realmente hace la solicitud. Incluso si se deja correr App Engine, este nombre se actualizará automáticamente en el Iniciador. Observe cómo se utilizó un guión, pero no usamos cualquier capitalización en el nombre; nombres de las aplicaciones de Google App Engine solo pueden incluir letras minúsculas, dígitos y guiones. </p> <h3> cordura Check (tener cinco)! </h3> <p> Ahora debería ser capaz de utilizar su nueva aplicación web, el suministro de temperaturas y ver el resultado convertido aparece en la misma página web. Debido a que utilizamos una petición “obtener”, también podemos ver ahora aparecen los datos suministrados por el usuario en la URL. De hecho, incluso se puede eludir la forma con su propio valor para cel_temp mediante el suministro de una dirección adecuada. Por ejemplo, trate de escribir la URL localhost <em>: 8080/30 = cel_temp </em> directamente en su navegador y verá la conversión de la temperatura resultante?. </p> <h3> Ejercicios de repaso: </h3> <p> Modificar el “conectarse” ejemplo de aplicación web, por lo que sólo tiene una única página web principal que puede recibir “obtener” las peticiones del usuario; en lugar de una “sesión” botón debajo del campo de texto, hacer una “Saludad a mí!” botón que, al hacer clic, vuelve a cargar la página para saludar al usuario por su nombre (si un nombre ha sido suministrado) y mostrar el formulario saludo nuevo Asignación </p> <h2> </h2> <h3> Las ganancias poeta una presencia en la web </h3> <p> recrear el generador poema al azar de la primera Por supuesto pitón real. Debe utilizar un formulario web como el de poem-generator.appspot.com para ayudar a su usuario generar poemas. Se puede ver el código fuente de esta página web para realizar ingeniería inversa mayor parte del código HTML necesario. La aplicación web debe utilizar una única página web con un formulario único que acepta “obtener” las peticiones del usuario. Bono: Aprende a usar los archivos estáticos como CSS en su aplicación web para mejorar su aspecto general y hacer que el código HTML más fácil de leer y mantener. </p> <h2> despliegue </h2> <p> Ha llegado el momento de compartir su hermoso trabajo con el mundo. Conseguir su contenido en línea es en realidad un proceso bastante sencillo con Google App Engine. </p> <p> Google ofrece un servicio gratuito en appspot.com que le permite alojar hasta diez diferentes aplicaciones web (siempre y cuando usted no tiene millones de usuarios que acceden a ellos cada mes, en cuyo caso se tendrá que actualizar a un abonado plan). Primero tendrá que ir al Google consola de desarrollo y abrir una sesión. </p> <p> Una vez que haya entrado en el sistema, puede crear un nuevo proyecto y darle un nombre único proyecto. Este nombre aparecerá en el URL de su aplicación, lo que se verá así: http://your-application-name.appspot.com. Las siguientes tres imágenes le guiará a través de los clics que se necesita para hacer esto. En los ejemplos ilustrados he usado “realpython” como mi nombre del proyecto. </p> <p> <strong> Vaya a la vista de escritorio y verá esta barra de herramientas. Este botón en el lado izquierdo le mostrará la lista de proyectos de Google que es el propietario. </strong> </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/google_dev_project_select.ca1e0806dbd3.png"> </p> <p> <strong> En esa lista, haga clic en “Crear un proyecto”. </strong> </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/google_dev_create_project.f30e6d1438ba.png"> </p> <p> <strong> Dentro de su tablero de instrumentos de su nuevo nombre del proyecto se mostrará con un identificador único. En mi caso “realpython-1174”. </strong> </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/google_dev_project_id.39891e7df2ae.png"> </p> <p> Dado que esta es una dirección URL directa que debe ser único, Google le ayudará a cabo mediante la adición de algunos números al final de su nombre elegido si ya está en uso. Voy a utilizar la aplicación de conversión de temperatura y el nombre de la mina “Medidor de temperatura Estado”. Cualquiera que sea que terminan usando como el nombre del proyecto, asegúrese de actualizar el archivo de configuración para que el nombre proporcionado por la “aplicación” en la primera línea del archivo coincide con el ID del proyecto. </p> <p> En este punto ya está listo para iniciar su aplicación. Asegúrese de ejecutar dicho comando con <strong> su proyecto de identificación </strong> (no ‘realpython-1174’). En el directorio first_app ejecutar esta línea: </p> <p> <code>$ appcfg.py -A realpython-1174 update app.yaml<br /> </code> </p> <p> Una ventana se abrirá pidiéndole que verifique que usted es el propietario de esta cuenta de Google. Conforme y ahora su aplicación está en marcha !!! Ir a http://YourProjectID.appspot.com/ a echar un vistazo. usuarios </p> <p> Linux: tendrá que navegar a la carpeta justo antes de la carpeta “first_app”, a continuación, utilizar el siguiente comando para cargar la aplicación a través de App Engine: google_appengine / actualización appcfg.py first_app / </p> <p> Si aparece el mensaje “ esta aplicación no existe”, entonces o bien no está registrado correctamente la aplicación o el nombre de la aplicación web no coincide con el identificador de la aplicación que nos ha facilitado. Felicidades <strong>! Ahora tiene una página web en vivo de su propio código Python en ejecución. </strong> </p> <p> Google tiene una serie de otra mano integrado de características, incluyendo la capacidad de almacenar datos de usuario “persistentes” (que dura incluso después de que las hojas de los usuarios del sitio web) desde su aplicación e incluso una forma de integrar su aplicación con sus usuarios ‘cuentas de Google. Los tutoriales y documentación actuales incluyen código de ejemplo funcional pero anticuado, aunque todavía puede dar una idea de lo que es posible más allá de los conceptos básicos. </p> <p> Para los sitios web complejos, escribiendo largos bloques de HTML es bastante ineficiente y difícil de manejar, por lo que una serie de marcos se han desarrollado para ayudar a organizar y acelerar el proceso de desarrollo web utilizando plantillas y piezas pre-construidos de código. Django es quizás el framework de desarrollo web más populares. Frasco y web2py son otras opciones populares; web2py es especialmente bueno en la integración con bases de datos. Todos estos marcos web se puede ejecutar por su cuenta o configura a través de Google App Engine en lugar de utilizar webapp2. De hecho, App Engine soporta plantillas de Django dentro webapp2 por defecto. </p> <p> Una vez más, para más desarrollo web con Python, disfrutar de los cursos segundo y tercero real Python, desarrollo web <em> con </em> Python y Desarrollo Web <em> avanzada con Django </em>, que detalle cómo se desarrollan poderosa aplicación web en el frasco, web2py, y Django, entre otros: muestra </p> <p> <strong> gratuito: </strong> Haga clic aquí para obtener acceso a un capítulo de la muestra libre de la real Python curso que muestra cómo el trabajo con el curso y la forma en que le ayudará a ganar habilidades prácticas de programación Python. </p> </div><!-- .entry-content --> </div><!-- .post-inner --> <div class="section-inner"> </div><!-- .section-inner --> <nav class="pagination-single section-inner" aria-label="Entrada" role="navigation"> <hr class="styled-separator is-style-wide" aria-hidden="true" /> <div class="pagination-single-inner"> <a class="previous-post" href="https://eltecnofilo.es/cartilla-en-python-decoradores/"> <span class="arrow" aria-hidden="true">←</span> <span class="title"><span class="title-inner">Cartilla en Python decoradores</span></span> </a> <a class="next-post" href="https://eltecnofilo.es/python-api-rest-con-el-frasco-connexion-y-sqlalchemy-parte-4/"> <span class="arrow" aria-hidden="true">→</span> <span class="title"><span class="title-inner">Python API REST con el frasco, Connexion, y SQLAlchemy – Parte 4</span></span> </a> </div><!-- .pagination-single-inner --> <hr class="styled-separator is-style-wide" aria-hidden="true" /> </nav><!-- .pagination-single --> <div class="comments-wrapper section-inner"> <div id="respond" class="comment-respond"> <h2 id="reply-title" class="comment-reply-title">Deja un comentario <small><a rel="nofollow" id="cancel-comment-reply-link" href="/descubrir-frasco-parte-2-creacion-de-una-pagina-de-entrada/#respond" style="display:none;">Cancelar la respuesta</a></small></h2><form action="https://eltecnofilo.es/wp-comments-post.php" method="post" id="commentform" class="section-inner thin max-percentage" novalidate><p class="comment-notes"><span id="email-notes">Tu dirección de correo electrónico no será publicada.</span> Los campos obligatorios están marcados con <span class="required">*</span></p><p class="comment-form-comment"><label for="comment">Comentario</label> <textarea id="comment" name="comment" cols="45" rows="8" maxlength="65525" required="required"></textarea></p><p class="comment-form-author"><label for="author">Nombre <span class="required">*</span></label> <input id="author" name="author" type="text" value="" size="30" maxlength="245" required='required' /></p> <p class="comment-form-email"><label for="email">Correo electrónico <span class="required">*</span></label> <input id="email" name="email" type="email" value="" size="30" maxlength="100" aria-describedby="email-notes" required='required' /></p> <p class="comment-form-url"><label for="url">Web</label> <input id="url" name="url" type="url" value="" size="30" maxlength="200" /></p> <p class="comment-form-cookies-consent"><input id="wp-comment-cookies-consent" name="wp-comment-cookies-consent" type="checkbox" value="yes" /> <label for="wp-comment-cookies-consent">Guardar mi nombre, correo electrónico y sitio web en este navegador para la próxima vez que haga un comentario.</label></p> <p class="form-submit"><input name="submit" type="submit" id="submit" class="submit" value="Publicar el comentario" /> <input type='hidden' name='comment_post_ID' value='6643' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p></form> </div><!-- #respond --> </div><!-- .comments-wrapper --> </article><!-- .post --> </main><!-- #site-content --> <div class="footer-nav-widgets-wrapper header-footer-group"> <div class="footer-inner section-inner"> <aside class="footer-widgets-outer-wrapper" role="complementary"> <div class="footer-widgets-wrapper"> <div class="footer-widgets column-one grid-item"> <div class="widget widget_search"><div class="widget-content"><form role="search" method="get" class="search-form" action="https://eltecnofilo.es/"> <label for="search-form-2"> <span class="screen-reader-text">Buscar:</span> <input type="search" id="search-form-2" class="search-field" placeholder="Buscar …" value="" name="s" /> </label> <input type="submit" class="search-submit" value="Buscar" /> </form> </div></div> <div class="widget widget_recent_entries"><div class="widget-content"> <h2 class="widget-title subheading heading-size-3">Entradas recientes</h2> <ul> <li> <a href="https://eltecnofilo.es/vps-cloud-hosting/">VPS cloud hosting</a> </li> <li> <a href="https://eltecnofilo.es/versiones-de-ejecucion-de-python-en-acoplable-como-probar-la-ultima-release-python/">Versiones de ejecución de Python en acoplable: Cómo probar la última Release Python</a> </li> <li> <a href="https://eltecnofilo.es/leer-y-escribir-archivos-csv/">Leer y escribir archivos CSV</a> </li> <li> <a href="https://eltecnofilo.es/python-puro-vs-vs-numpy-tensorflow-comparacion-de-rendimiento/">Python puro vs vs NumPy TensorFlow Comparación de Rendimiento</a> </li> <li> <a href="https://eltecnofilo.es/estructura-python-programa-lexico/">Estructura Python Programa léxico</a> </li> </ul> </div></div><div class="widget widget_recent_comments"><div class="widget-content"><h2 class="widget-title subheading heading-size-3">Comentarios recientes</h2><ul id="recentcomments"><li class="recentcomments"><span class="comment-author-link"><a href="https://wordpress.org/" rel="external nofollow ugc" class="url">A WordPress Commenter</a></span> en <a href="https://eltecnofilo.es/hello-world/#comment-1">Hello world!</a></li></ul></div></div> </div> <div class="footer-widgets column-two grid-item"> <div class="widget widget_archive"><div class="widget-content"><h2 class="widget-title subheading heading-size-3">Archivos</h2> <ul> <li><a href='https://eltecnofilo.es/2020/04/'>abril 2020</a></li> <li><a href='https://eltecnofilo.es/2020/03/'>marzo 2020</a></li> <li><a href='https://eltecnofilo.es/2019/12/'>diciembre 2019</a></li> </ul> </div></div><div class="widget widget_categories"><div class="widget-content"><h2 class="widget-title subheading heading-size-3">Categorías</h2> <ul> <li class="cat-item cat-item-22"><a href="https://eltecnofilo.es/category/python/">Python</a> </li> <li class="cat-item cat-item-1"><a href="https://eltecnofilo.es/category/uncategorized/">Uncategorized</a> </li> </ul> </div></div><div class="widget widget_meta"><div class="widget-content"><h2 class="widget-title subheading heading-size-3">Meta</h2> <ul> <li><a rel="nofollow" href="https://eltecnofilo.es/wp-login.php">Acceder</a></li> <li><a href="https://eltecnofilo.es/feed/">Feed de entradas</a></li> <li><a href="https://eltecnofilo.es/comments/feed/">Feed de comentarios</a></li> <li><a href="https://es.wordpress.org/">WordPress.org</a></li> </ul> </div></div> </div> </div><!-- .footer-widgets-wrapper --> </aside><!-- .footer-widgets-outer-wrapper --> </div><!-- .footer-inner --> </div><!-- .footer-nav-widgets-wrapper --> <footer id="site-footer" role="contentinfo" class="header-footer-group"> <div class="section-inner"> <div class="footer-credits"> <p class="footer-copyright">© 2020 <a href="https://eltecnofilo.es/">My Blog</a> </p><!-- .footer-copyright --> <p class="powered-by-wordpress"> <a href="https://es.wordpress.org/"> Funciona gracias a WordPress </a> </p><!-- .powered-by-wordpress --> </div><!-- .footer-credits --> <a class="to-the-top" href="#site-header"> <span class="to-the-top-long"> Ir arriba <span class="arrow" aria-hidden="true">↑</span> </span><!-- .to-the-top-long --> <span class="to-the-top-short"> Subir <span class="arrow" aria-hidden="true">↑</span> </span><!-- .to-the-top-short --> </a><!-- .to-the-top --> </div><!-- .section-inner --> </footer><!-- #site-footer --> <script src='https://eltecnofilo.es/wp-includes/js/comment-reply.min.js?ver=5.3.3'></script> <script src='https://eltecnofilo.es/wp-includes/js/wp-embed.min.js?ver=5.3.3'></script> <script> /(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())},!1); </script> </body> </html>