Categorías
Python

Lista de objetivos vacaciones de una Pythonista

 

Tabla de Contenidos

  • Lo resto es
  • Lo RESTO no es
  • La gente API REST
  • Introducción
  • El uso de Connexion agregar una API REST de punto final
  • Adición de Connexion el fichero de configuración Swagger ServerThe
  • El Swagger archivo de configuración
  • de Manejador de personas EndpointThe Swagger IU
  • el Swagger IU
  • de construcción fuera de la completa APIThe Swagger IU Completado
  • el Swagger IU Completado
  • demostración Página única ApplicationStatic FilesJavaScript Aplicación FileDemo
  • archivos estáticos
  • JavaScript archivo
  • aplicación de demostración
  • Ejemplo Código
  • Conclusión archivo
  • La configuración Swagger
  • La interfaz de usuario Swagger
  • El Swagger interfaz de usuario archivo Completo
  • estática archivos
  • JavaScript
  • demostración de aplicaciones
  • T G_019

    Si estás escribiendo un aplicación web, entonces probablemente estás pensando en hacer llamadas HTTP al servidor para obtener los datos que pueblan las partes dinámicas de su aplicación.

    El objetivo de este artículo es mostrar cómo utilizar Python 3, Frasco, y Connexion para construir API REST útiles que pueden incluir la entrada y salida de validación, y proporcionar documentación Swagger como un bono. También se incluye una aplicación web de una sola página sencilla pero útil que demuestra el uso de la API con JavaScript y actualizar el DOM con él. API

    el descanso que será la construcción servirá una sencilla estructura de los datos donde la gente tienen la forma adecuada para el apellido, y las actualizaciones están marcados con una nueva marca de tiempo.

    Estos datos podrían estar representados en un base de datos, se guardan en un archivo o sean accesibles a través de algún protocolo de red, pero para nosotros una en memoria estructura de datos funciona bien. Uno de los propósitos de una API es disociar los datos de la aplicación que lo utiliza, ocultando los detalles de implementación de datos. Bono

    gratuito: Haga clic aquí para descargar una copia de los «Ejemplos» API REST Guía y obtener una introducción práctica a principios del API Python + REST con ejemplos de acciones concretas. Lo

    resto es

    Antes de empezar a crear un servidor API, quiero hablar de descansar un poco. No hay mucha información sobre el descanso disponibles a través de algunas búsquedas rápidas de Google, y mi intención no es duplicar eso aquí.

    yo sólo quiero compartir cómo veo REST y utilizarlo para construir API. Veo RESTO como un conjunto de convenciones que se aprovechan del protocolo HTTP para proporcionar CRUD (crear, leer, actualizar y eliminar) el comportamiento de las cosas y las colecciones de esas cosas. El comportamiento CRUD mapas muy bien a los verbos método protocolo HTTP como este:

    Usted puede realizar estas acciones en una cosa u otra fuente. Es útil pensar en un recurso como algo sustantivo se puede aplicar a: una persona, un pedido de algo, la dirección de una persona. Esta idea de una línea de recursos muy bien con una dirección URL (Localizador de Recurso Único).

    Un URL debe identificar un recurso único en la web, algo que va a trabajar con la misma cosa una y otra vez por la misma URL. Con estas dos ideas, tenemos una manera de tomar acciones de aplicación comunes en algo identificado de forma única en la web. Esta es una forma muy útil de trabajo.

    Esta idea va un largo camino hacia la creación de APIs limpias y la realización de las acciones de muchas aplicaciones quieren de la API.

    Lo RESTO no es

    porque el descanso es útil y ayuda a trazar cómo puede ser que desee interactuar con un API basado en la web, se utiliza a veces para las cosas que realmente no encajan bien. Hay un montón de casos en los que lo que queremos hacer es realizar algún trabajo o tomar una acción directa. Un ejemplo podría ser realizando una sustitución de cuerdas, que concede es un disparate hacer una API para, pero vamos a ir con todo por ahora. He aquí una dirección URL que podría ser construido para proporcionar la siguiente:

    /api/substituteString///

    Aquí, la cadena es la cadena para hacer la sustitución en, SEARCH_STRING es la cadena a reemplazar y sub_string es la cadena para reemplazar SEARCH_STRING con. Esto sin duda puede estar ligada a un cierto código en el servidor que hace el trabajo previsto. Pero esto tiene algunos problemas en términos de descanso.

    Un problema que viene a la mente es que esta URL no apunta a un recurso único, por lo que lo que devuelve es totalmente dependiente de las secciones variables camino. Además, no existe el concepto de CRUD contra esta URL. En realidad, sólo necesita un método HTTP y el método de nombre transmite nada acerca de la acción a tomar.

    Como una API, no es grande tampoco. El significado de las variables de ruta depende de su posición en la URL. Esto podría abordarse mediante el cambio de la dirección URL a usar una cadena de consulta en su lugar, como este:

    /api/substituteString?string=&search_string=&sub_string=

    Pero la parte URL / api / substituteString no es una cosa (sustantivo) o una colección de cosas en absoluto: se trata de una acción (verbo) .

    Esto no encaja bien en las convenciones de descanso, y tratar de forzarlo a hacerlo hace que para una API pobres. Lo anterior representa realmente es un RPC, o llamada a procedimiento remoto. Pensando en esto como una RPC tiene mucho más sentido.

    La belleza es que ambas convenciones REST y RPC pueden coexistir en una API sin ningún problema! Al mantener en mente la intención de cada uno, se puede utilizar tanto para complementar entre sí en el diseño de su API. Hay muchas situaciones en las que sería útil para realizar operaciones CRUD en algo. También hay muchas situaciones en las que sería útil tomar una acción con una cosa (como parámetro) pero no afecta necesariamente la cosa misma.

    La gente API REST

    Para nuestro programa de ejemplo, vamos a crear una API REST que proporciona acceso a un conjunto de personas con acceso CRUD a una persona individual dentro de esa colección. Aquí está el diseño de la API para la recogida de personas:

    Introducción

    En primer lugar, vamos a crear un servidor web simple usando .NET Micro frasco. Para empezar, crea un directorio donde se puede crear el código. También debe trabajar en un virtualenv para que pueda instalar módulos más adelante, que usted tiene que hacer. Además, crear un directorio de plantillas. código

    El pitón de abajo para crear una servidor web muy básico en funcionamiento, y respondiendo con Hello World para una solicitud de la página principal:

    from flask import (
    Flask,
    render_template
    )

    # Create the application instance
    app = Flask(__name__, template_folder="templates")

    # Create a URL route in our application for "/"
    @app.route('/')
    def home():
    """
    This function just responds to the browser ULR
    localhost:5000/

    :return: the rendered template 'home.html'
    """
    return render_template('home.html')

    # If we're running in stand alone mode, run the application
    if __name__ == '__main__':
    app.run(debug=True)

    También debe crear un home.html en la carpeta de plantillas, ya que esto es lo que va ser servido a un navegador cuando se navega a la dirección URL ‘/’. Aquí está el contenido del archivo home.html:





    Application Home Page<itle><br /> </head><br /> <body></p> <h2> Hello World!<br /> </h2> <p></body><br /> </html><br /> </code> </p> <p> Se dará cuenta el archivo HTML se denomina home.html en lugar de index.html. Esto es intencional porque tener un archivo index.html en el directorio de plantillas causa problemas una vez que se importa el módulo de Connexion en su programa. </p> <p> Puede ejecutar su aplicación con esta línea de comandos en el directorio que contiene el archivo server.py con el virtualenv Python activo: </p> <p> <code>python server.py<br /> </code> </p> <p> Cuando se ejecuta esta aplicación, un servidor web, empezará en el puerto 5000, que es el puerto por defecto utilizado por frasco. Si abre un navegador y vaya a localhost: 5000, debería ver Hello World! desplegado. En este momento, esto es útil para ver el servidor Web se está ejecutando. Vas a extender el archivo home.html más tarde para convertirse en una aplicación única página web completa utilizando la API REST que está en desarrollo. </p> <p> En el programa de Python, que haya importado el módulo Frasco, dando a la aplicación acceso a la funcionalidad del frasco. A continuación, crear una instancia de la aplicación del frasco, la variable de aplicación. A continuación, se conecta la ruta URL ‘/’ a la función de inicio () por la decoración con @ app.route ( ‘/’). Esta función llama a la función Frasco render_template () para obtener el archivo home.html desde el directorio de plantillas y volver al navegador. </p> <p> Todo el código de ejemplo está disponible a partir de un enlace que aparece al final de este artículo. </p> <h2> El uso de Connexion Añadir a una API REST de punto final </h2> <p> Ahora que usted tiene un servidor web de trabajo, vamos a agregar un punto final de la API REST. Para ello, vamos a usar el módulo de Connexion, que se instala mediante pip: </p> <p> <code>$ pip install connexion<br /> </code> </p> <p> Esto hace que el módulo de Connexion disponible para su programa. El módulo de Connexion permite que un programa Python para utilizar la especificación Swagger. Esto proporciona una gran cantidad de funcionalidad: la validación de los datos de entrada y salida desde y hacia su API, una manera fácil de configurar los puntos finales de API URL y los parámetros esperados, y una interfaz de la interfaz de usuario muy agradable trabajar con la API creada y explorarlo. </p> <p> Todo esto puede suceder cuando se crea un archivo de configuración puede acceder la aplicación. El sitio de Swagger incluso proporciona una herramienta de editor de configuración en línea para ayudar a crear y / o comprobar la sintaxis del archivo de configuración que va a crear. </p> <h2> Añadiendo Connexion a la </h2> <p> servidor Hay dos partes en la adición de un extremo REST API URL para su aplicación con Connexion. Vamos a añadir Conexión al servidor y crear un archivo de configuración que utilizará. Modificar su programa de Python como este para añadir Conexión al servidor: </p> <p> <code>from flask import render_template<br /> import connexion</p> <p># Create the application instance<br /> app = connexion.App(__name__, specification_dir='./')</p> <p># Read the swagger.yml file to configure the endpoints<br /> app.add_api('swagger.yml')</p> <p># Create a URL route in our application for "/"<br /> @app.route('/')<br /> def home():<br /> """<br /> This function just responds to the browser ULR<br /> localhost:5000/<br /> :return: the rendered template 'home.html'<br /> """<br /> return render_template('home.html')</p> <p># If we're running in stand alone mode, run the application<br /> if __name__ == '__main__':<br /> app.run(host='0.0.0.0', port=5000, debug=True)<br /> </code> </p> <p> Ha añadido un par de cosas para incorporar Connexion en el servidor. La declaración de importación añade conexión del módulo al programa. El siguiente paso es la creación de la instancia de la aplicación usando Connexion en lugar de Flask. Internamente, el matraz aplicación está siendo creado, pero ahora se ha añadido una funcionalidad adicional a la misma. </p> <p> Parte de la creación de la instancia aplicación comprende la specification_dir parámetro. Esto informa Connexion lo que debe buscar en el directorio de su archivo de configuración, en este caso, nuestro directorio actual. Inmediatamente después de esto, se ha añadido la línea: app.add_api </p> <p> ( ‘swagger.yml’) </p> <p> Esto indica a la instancia aplicación para leer el swagger.yml archivo desde el directorio de especificación y configurar el sistema para proporcionar la funcionalidad Connexion . Archivo </p> <h3> La configuración Swagger </h3> <p> El swagger.yml archivo es un archivo YAML o JSON que contiene toda la información necesaria para configurar el servidor para proporcionar la validación de entrada de parámetros, la validación de datos de respuesta de salida, definición URL de punto final y la interfaz de usuario Swagger. Aquí está el archivo de definición de la swagger.yml / api / personas de punto final a su API REST GET proporcionará: </p> <p> <code>swagger: "2.0"<br /> info:<br /> description: This is the swagger file that goes with our server code<br /> version: "1.0.0"<br /> title: Swagger REST Article<br /> consumes:<br /> - "application/json"<br /> produces:<br /> - "application/json"</p> <p>basePath: "/api"</p> <p># Paths supported by the server application<br /> paths:<br /> /people:<br /> get:<br /> operationId: "people.read"<br /> tags:<br /> - "People"<br /> summary: "The people data structure supported by the server application"<br /> description: "Read the list of people"<br /> responses:<br /> 200:<br /> description: "Successful read people list operation"<br /> schema:<br /> type: "array"<br /> items:<br /> properties:<br /> fname:<br /> type: "string"<br /> lname:<br /> type: "string"<br /> timestamp:<br /> type: "string"<br /> </code> </p> <p> Este archivo está organizado de una manera jerárquica: los niveles de sangría representan un nivel de propiedad, o alcance. </p> <p> Por ejemplo, caminos define el comienzo de donde se definen todos los puntos finales de URL de la API. Los / las personas valoran sangría bajo que define el inicio de donde todos los / API / personas se definirán los puntos finales de URL. El get: sangría bajo que define la sección de definiciones asociadas a una solicitud HTTP GET para el punto final / api / URL personas. Esto continúa para toda la configuración. </p> <p> Estos son los significados de los campos de esta sección del archivo swagger.yml: </p> <p> Esta sección es parte de la información de configuración global: </p> <p> Esta sección se inicia la configuración de las rutas de URL de punto final de la API: </p> <p> Esta sección comienza la configuración del single / api / gente URL de punto final: </p> <p> Esta sección define la sección de la configuración de una respuesta satisfactoria desde el punto final URL: </p> <h2> de Manejador de personas Punto </h2> <p> En el archivo swagger.yml, se configura con Connexion el valor operationId para llamar módulo de la gente y la función de lectura dentro del módulo cuando la API recibe una solicitud HTTP GET para / API / personas. Esto significa un módulo people.py debe existir y contener una función de lectura (). Aquí está el módulo people.py creará: </p> <p> <code>from datetime import datetime</p> <p>def get_timestamp():<br /> return datetime.now().strftime(("%Y-%m-%d %H:%M:%S"))</p> <p># Data to serve with our API<br /> PEOPLE = {<br /> "Farrell": {<br /> "fname": "Doug",<br /> "lname": "Farrell",<br /> "timestamp": get_timestamp()<br /> },<br /> "Brockman": {<br /> "fname": "Kent",<br /> "lname": "Brockman",<br /> "timestamp": get_timestamp()<br /> },<br /> "Easter": {<br /> "fname": "Bunny",<br /> "lname": "Easter",<br /> "timestamp": get_timestamp()<br /> }<br /> }</p> <p># Create a handler for our read (GET) people<br /> def read():<br /> """<br /> This function responds to a request for /api/people<br /> with the complete lists of people</p> <p> :return: sorted list of people<br /> """<br /> # Create the list of people from our data<br /> return [PEOPLE[key] for key in sorted(PEOPLE.keys())]<br /> </code> </p> <p> En este código, usted ha creado una función auxiliar llamada get_timestamp () que genera una representación de cadena de la fecha y hora actual. Esto se utiliza para crear su estructura en memoria y modificar los datos cuando se inicia modificándolo con la API. </p> <p> A continuación, creó la estructura PERSONAS diccionario de datos, que es una base de datos de nombres simples, introducido en el apellido. Esta es una variable de módulo, por lo que su estado persiste entre llamadas a la API REST. En una aplicación real, existirían los datos de las personas en una base de datos, archivo o recurso de red, algo que persiste más allá de los datos de funcionamiento / detención de la aplicación web. </p> <p> Entonces creó la función de lectura (). Esto se llama cuando una solicitud HTTP a GET / api / personas son recibidos por el servidor. El valor de retorno de esta función se convierte en una cadena JSON (recordar la produce: definición en el archivo swagger.yml). La función de lectura () que ha creado construye y devuelve una lista de las personas ordenadas por el apellido. </p> <p> El funcionamiento de su código de servidor y navegando en un navegador para localhost: 5000 / API / gente va a mostrar la lista de las personas que aparecen en pantalla: </p> <p> <code>[<br /> {<br /> "fname": "Kent",<br /> "lname": "Brockman",<br /> "timestamp": "2018-05-10 18:12:42"<br /> },<br /> {<br /> "fname": "Bunny",<br /> "lname": "Easter",<br /> "timestamp": "2018-05-10 18:12:42"<br /> },<br /> {<br /> "fname": "Doug",<br /> "lname": "Farrell",<br /> "timestamp": "2018-05-10 18:12:42"<br /> }<br /> ]<br /> </code> </p> <p> Felicidades, usted ha creado una API agradable y está en su camino a la construcción de una completa ¡uno! </p> <h3> La interfaz de usuario Swagger </h3> <p> Ahora usted tiene una sencilla API web que se ejecuta con un único criterio de valoración URL. En este punto, sería razonable pensar, “la configuración de este con el archivo swagger.yml era fresco y todo, pero lo que hizo que esto me?” </p> <p> tendría razón para pensar eso. No hemos tomado ventaja de la validación de entrada o salida. Todo lo que swagger.yml nos dio fue una definición para la ruta de código conectado al punto final de la URL. Sin embargo, lo que también se obtiene por el trabajo extra es la creación de la interfaz de usuario Swagger para su API. </p> <p> Si se desplaza a localhost: 5000 / api / ui, el sistema accederá a una página que se ve algo como esto: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/swagger_ui_initial.3bd1145882f8.png"> </p> <p> Esta es la interfaz Swagger inicial y muestra la lista de puntos finales URL soportados en nuestra localhost: 5000 / api punto final. Esto se construye automáticamente por Connexion cuando se analiza el archivo swagger.yml. </p> <p> Si hace clic en el / la gente el punto final en la interfaz, la interfaz se expandirá para mostrar mucha más información acerca de su API y debe ser algo como esto: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/swagger_ui_expanded_1.751b4216ef04.png"> </p> <p> Esto muestra la estructura de la respuesta esperada, la tipo de contenido de esa respuesta, y la descripción de texto que ha introducido sobre el punto final en el archivo swagger.yml. </p> <p> Puede incluso intentar el punto final haciendo clic en el Es probar! botón en la parte inferior de la pantalla. Eso va a ampliar aún más la interfaz a ser algo como esto: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/swagger_ui_expanded_2.1426ae4a6012.png"> </p> <p> Esto puede ser extremadamente útil cuando la API es completa, ya que usted y sus usuarios de la API da una forma de explorar y experimentar con la API sin tener que escribir ningún código para hacerlo. </p> <p> construcción de una API de esta manera es muy útil para mí en el trabajo. No sólo es la interfaz de usuario Swagger útil como una manera de experimentar con la API y lea la documentación proporcionada, pero también es dinámico. Cualquier momento cambia el archivo de configuración, la interfaz de usuario Swagger cambia también. </p> <p> Además, las ofertas de configuración de un bonito, limpio manera de pensar y crear los puntos finales de API URL. Sé por experiencia que las API pueden desarrollarse de manera aleatoria a veces con el tiempo, por lo que encontrar el código que es compatible con los criterios de valoración, y la coordinación de ellos, muy difícil. </p> <p> Al separar el código de la configuración de extremo URL de la API, que desacoplar el uno del otro. Esto por sí solo ha sido muy útil para mí en mis sistemas API de construcción trabajos que apoyen las aplicaciones web de una sola página. </p> <h2> de construcción fuera de la API completa </h2> <p> Nuestro objetivo original era construir una API que proporciona acceso completo a CRUD nuestra estructura personas. Como se recordará, la definición de nuestra apariencia API como esta: </p> <p> Para lograr esto, se le extenderá los swagger.yml y archivos people.py para apoyar plenamente la API definido anteriormente. En aras de la brevedad, se hará efectiva sólo un enlace para ambos archivos: </p> <ul> <li> swagger.yml </li> <li> people.py </li> </ul> <h3> La interfaz de usuario Swagger Completado </h3> <p> Una vez que haya actualizado los archivos swagger.yml y people.py para completar la funcionalidad de las personas de la API, el sistema de interfaz de usuario Swagger se actualizará en consecuencia y verá algo como esto: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/swagger_ui_complete.a61f81c9fe3d.png"> </p> <p> esta interfaz de usuario le permite ver toda la documentación que ha incluido en el archivo swagger.yml e interactuar con todos los criterios de valoración de URL que componen la funcionalidad CRUD de la interfaz de personas. </p> <h2> Demostración de una sola página de la aplicación </h2> <p> usted tiene una API REST se trabaja con un gran sistema de documentación / interacción Swagger interfaz de usuario. Pero, ¿qué hacer con él ahora? El siguiente paso es crear una aplicación web que demuestra el uso de la API de una manera semi-práctico. </p> <p> Vamos a crear un aplicación web que muestra las personas que aparecen en pantalla, así como permite al usuario crear nuevas personas, la gente de actualización existentes, y la gente de borrado. Todo esto va a ser manejado por las llamadas AJAX de JavaScript a los criterios de valoración URL gente API. </p> <p> Para empezar, es necesario ampliar el archivo home.html a tener este aspecto: </p> <p> <code><!DOCTYPE html><br /> <html lang="en"><br /> <head><br /> <meta charset="UTF-8"><br /> <title>Application Home Page<itle> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs<br />ormalize/8.0.0<br />ormalize.min.css"> <link rel="stylesheet" href="static/css/home.css"> <script src="http://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"> </script><br /> </head><br /> <body></p> <div class="container"> <h1 class="banner">People Demo Application</h1> <div class="section editor"> <label for="fname">First Name<br /> <input id="fname" type="text" /><br /> </label><br /> <br /> <label for="lname">Last Name<br /> <input id="lname" type="text" /><br /> </label><br /> <br /> <button id="create">Create</button><br /> <button id="update">Update</button><br /> <button id="delete">Delete</button><br /> <button id="reset">Reset</button> </div> <div class="people"> <table> <caption>People</caption> <thead> <tr> <th>First Name<h></p> <th>Last Name<h></p> <th>Update Time<h><br /> <r><br /> <head></p> <tbody> <body><br /> <able> </div> <div class="error"> </div> </p></div> <p></body><br /> <script src="static/js/home.js"></script><br /> </html><br /> </code> </p> <p> El anterior código HTML extiende el archivo home.html para tirar en el archivo normalize.min.css externa, que es un archivo CSS reset para normalizar el formato de los elementos a través de los navegadores. </p> <p> También tira en el archivo externo jquery-3.3.1.min.js para proporcionar la funcionalidad de jQuery que va a utilizar para crear la interactividad aplicación de una sola página. </p> <p> código HTML </p> <p> El anterior crea el marco estático de la aplicación. Las partes dinámicas que aparecen en la estructura de tabla se añadirán por JavaScript en tiempo de carga y, como el usuario interactúa con la aplicación. Archivos </p> <h3> estático </h3> <p> En el archivo home.html que ha creado, hay referencias a dos archivos estáticos: static / css / home.css estática y / js / home.js. Para añadir estos, se tendrá que añadir la siguiente estructura de directorios de la aplicación: </p> <p> <code>static/<br /> │<br /> ├── css/<br /> │ └── home.css<br /> │<br /> └── js/<br /> └── home.js<br /> </code> </p> <p> Debido a que un directorio llamado estática automáticamente será servido por la aplicación del frasco, los archivos que coloque en el css y js carpetas estará disponible para el archivo home.html. En aras de la brevedad, aquí están los enlaces a los archivos y home.css home.js: </p> <ul> <li> home.css </li> <li> home.js Archivo </li> </ul> <h3> JavaScript </h3> <p> Como se mencionó, el archivo JavaScript proporciona toda la interacción con y cambios a la aplicación web. Esto se hace mediante la ruptura de la funcionalidad necesaria en tres partes usando el patrón de diseño MVC (Modelo / Vista / Controlador). </p> <p> Cada objeto es creado por una función de auto-invocando devolver su propia API para el uso de las otras piezas. Por ejemplo, el controlador se hace pasar a las instancias de la del modelo y de Vista como parámetros en su instanciación. Interactúa con los objetos a través de sus métodos de la API expuestas. </p> <p> La única otra conexión es entre el modelo y el controlador por medio de eventos personalizados en las llamadas a métodos AJAX: </p> <p> También maneja los eventos personalizados generados por las peticiones AJAX asíncronas realizadas por el modelo de la API de personas. </p> <p> Aquí es un diagrama de la estructura MVC utilizado en el archivo home.js: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/mvc.b7675fb5f043.png"> </p> <p> La idea es que el controlador tiene un fuerte vínculo con el modelo y la vista. El modelo tiene un punto débil (los eventos personalizados) al controlador y no hay conexión a la vista en todo. El punto débil de la Modelo al controlador reduce el acoplamiento y la dependencia, que es útil en este caso. </p> <h3> Demostración de aplicaciones </h3> <p> Cuando creada, la aplicación web se verá así en el navegador: </p> </p> <p> <img src="https://eltecnofilo.es/wp-content/uploads/2020/03/connexion_application.2124789635a0.png"> </p> <p> el botón Crear permite al usuario crear una nueva persona en la estructura de la gente en el servidor. Cuando se introduce un nombre y apellido y el éxito Crear, el controlador llama el modelo para hacer una solicitud a la / api / gente URL de punto final POST. Esto verificará que el apellido no existe ya. Si no lo hace, se creará una nueva persona en la estructura de la gente. </p> <p> Esto genera un evento personalizado en el modelo que hace que el controlador para llamar al nuevo modelo para solicitar un GET / api / personas, que devolverá una lista completa de las personas ordenadas. Entonces, el controlador pasa que a la vista de volver a dibujar la tabla de las personas. </p> <p> doble clic en cualquier fila de la tabla se rellenará los campos de nombre y apellido en la sección editor de la aplicación. En este punto, el usuario puede actualizar o borrar la persona. Para la actualización </p> <p> con éxito, el usuario debe cambiar algo en el Nombre. El último nombre debe seguir siendo la misma, ya que es la clave de búsqueda para la persona a la actualización. Cuando se hace clic en Update, el controlador llama el modelo para hacer una solicitud al PUT / api / personas / {} lname URL de punto final. Esto verificará que el último nombre existe actualmente. Si es así, se actualizará a esa persona en la estructura de la gente. </p> <p> Esto genera un evento personalizado en el modelo que hace que el controlador para llamar al nuevo modelo para solicitar un GET / api / personas, que devolverá una lista completa de las personas ordenadas. Entonces, el controlador pasa que a la vista de volver a dibujar la tabla de las personas. </p> <p> Para eliminar con éxito, el usuario sólo tiene que hacer clic en BORRAR. Cuando se hace clic en Eliminar, el controlador llama el modelo para hacer una solicitud a la API / personas / {} lname punto final BORRAR / URL. Esto verificará que el apellido existe actualmente. Si es así, se eliminará esa persona de la estructura de la gente. </p> <p> Esto genera un evento personalizado en el modelo que hace que el controlador para llamar al nuevo modelo para solicitar un GET / api / personas, que devolverá una lista completa de las personas ordenadas. Entonces, el controlador pasa que a la vista de volver a dibujar la tabla de las personas. </p> <p> Intente cometer errores intencionales en el editor, como falta de ortografía de un nombre pasado, y ver los errores generados por la API representado en la aplicación web. </p> <h2> Ejemplo Código </h2> <p> Todo el código de ejemplo de este artículo está disponible aquí. Hay cuatro versiones del código, cada uno en un directorio # version_, donde # rangos de 1 a 4. Los cuatro versiones corresponden a las secciones del artículo de esta manera: </p> <p> Bono <strong> gratuito: </strong> clic aquí para descargar una copia de la «REST API Ejemplos» Guía y obtener una introducción práctica a principios del API Python + REST con ejemplos de acciones concretas. </p> <h2> Conclusión </h2> <p> En este tutorial, se vio lo relativamente fácil que es crear una completa API REST con Python. Con el módulo de Connexion y un poco de trabajo de configuración adicional, una documentación útil y sistema interactivo se puede poner en su lugar, haciendo que su API de una experiencia mucho más agradable para sus usuarios operar y comprender. </p> <p> En la parte 2 de esta serie, aprenderá cómo utilizar una base de datos adecuada para almacenar sus datos de forma permanente en lugar de depender de almacenamiento en memoria como lo hicimos aquí: </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/como-comenzar-a-usar-la-api-slack-utilizar-python-y-el-frasco/"> <span class="arrow" aria-hidden="true">←</span> <span class="title"><span class="title-inner">Cómo comenzar a usar la API Slack utilizar Python y el frasco</span></span> </a> <a class="next-post" href="https://eltecnofilo.es/python-calidad-codigo-herramientas-y-buenas-practicas/"> <span class="arrow" aria-hidden="true">→</span> <span class="title"><span class="title-inner">Python Calidad Código: Herramientas y Buenas Prácticas</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="/lista-de-objetivos-vacaciones-de-una-pythonista/#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='6702' 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>