Este ejercicio está destinado a familiarizarse con la programación fundamental de backend/lado del servidor de manera interactiva, así como para que se sienta cómodo en un entorno moderno de Python/Flask.
Leer lo siguiente lo ayudará a tener una idea del panorama general cuando se trata de desarrollar API/escritura del código del lado del servidor, y cómo se ajusta en el contexto de una aplicación web más grande:
Este proyecto se dividirá en múltiples partes. Después de terminar este proyecto, debe enviarlo siguiendo las instrucciones a continuación.
Este ejercicio debe presentarse antes de este lunes 17 de septiembre a las 11:59 p.m. Si ha pasado más de 10 horas en total, incluido su trabajo con React-Exercise, ¡envíe lo que tiene!
Para cualquier pregunta, no dude en enviar un correo electrónico a [email protected].
Instrucciones de instalación para Mac y Windows.
Otro gran recurso para cualquier cosa en Python, incluida la instalación, es la Guía de Hitchhiker de Python.
Compruebe si tiene las versiones correctas ejecutando los siguientes comandos en su terminal:
python3 -V
pip3 -V
pipenv --version
Primero, bifurca este repositorio. El botón de la bifurcación en la parte superior derecha. Lo que esto hace es copiar este repositorio a su cuenta. Ahora debe tener un repositorio con el nombre <yourusername>/flask-exercise .
Debería verse así (mi nombre de usuario es TKO22): 
Luego, clone este repositorio (haga clic en el botón verde diciendo "clon o descargar", elija http y copie y pegue la ubicación <url> ) y entre en él:
$ git clone <url>
$ cd flask-exercise
Luego, configure su entorno virtual e instale las dependencias de Python requeridas para ejecutar esta aplicación. Usamos Pipenv, que configura automáticamente todo, dados un PipFile y PipFile.lock. Pipfile utiliza VirtualEnv, que es un entorno virtual de Python aislado de otros proyectos de Python, incapaz de interferir o ser afectado por otros programas de Python en la misma máquina. Por lo tanto, es capaz de ejecutar diferentes versiones del mismo paquete o incluso diferentes versiones de Python.
pipenv install --skip-lock
Debe estar en este entorno virtual para iniciar este servidor. Para hacer eso:
pipenv shell
Luego, para iniciar la ejecución del servidor:
(backend-exercise-o4dc6oDL)$ python app.py
Nota: Esto seguirá siendo un proceso en ejecución en su terminal, por lo que deberá abrir una nueva pestaña o ventana para ejecutar otros comandos.
Para detener el servidor, presione Control-C .
Para salir de su entorno virtual, que se llama backend-exercise-[something here] , ejecute:
(backend-exercise-o4dc6oDL)$ deactivate
También puede agregar pipenv run antes de cualquier comando en lugar de tener que ejecutar pipenv shell . por ejemplo, pipenv run python app.py
Antes de realizar cualquier cambio en el código, asegúrese de crear una nueva rama. Por lo general, las ramas se nombran en función de la característica o la interrupción de los errores, pero para este proyecto, nombre su rama con su propio nombre para que su revisor pueda seguir fácilmente:
git checkout -b <YOUR_NAME>
Los nombres de ramas deben ser todos en minúsculas y no pueden contener espacios. En lugar de espacios, use guiones. Por ejemplo:
git checkout -b varun-munjeti
Comenzar el servidor lo convertirá en un proceso de ejecución continua en localhost:5000 . Para hacer solicitudes a su servidor, use Postman.
Primero, haga una solicitud GET al / punto final. Dado que el servidor se ejecuta en localhost:5000 , la URL de punto final completo es localhost:5000/ .

Intente llamar al punto final /mirror . Primero, mire el código para el punto final para ver cómo puede especificar los parámetros de URL. Luego haga una solicitud en Postman a localhost:5000/mirror/<name> :

¡Estos ejercicios lo guiarán a través de la creación de una API RESTful usando Flask! No queremos que pase por toda la molestia de configurar una instancia de base de datos, por lo que hemos creado datos ficticios y una interfaz de base de datos simulada para interactuar con él. En aras de la facilidad, toda la lógica de la aplicación menos la lógica MOCKDB se implementará en app.py Para proyectos más grandes, los puntos finales de la API generalmente se separarán en diferentes archivos llamados views .
Antes de comenzar, eche un vistazo a la función create_response y cómo funciona. Asegúrese de seguir las pautas sobre cómo usar esta función, ¡de lo contrario su API no seguirá las convenciones adecuadas!
También eche un vistazo a la base de datos simulada. Los datos ficticios iniciales se definen en mockdb/dummy_data.py . Esto es lo que "existirá" en la "base de datos" cuando inicia el servidor.
Las funciones definidas en mockdb/mockdb_interface.py son cómo puede consultar el MockDB. En app.py , donde escribirá su API, esto se ha importado con el nombre db . Por lo tanto, cuando escribe el código para sus puntos finales, puede llamar a las funciones de la interfaz de DB como db.get('users') .
Cuando modifica su código, el servidor se actualizará automáticamente, a menos que su código no se compilará, en cuyo caso el servidor dejará de ejecutarse y debe reiniciarlo manualmente después de arreglar su código.
Defina el punto final:
GET /users
Esto debería devolver una respuesta JSON correctamente formateada que contenga una lista de todos los user en el MOCKDB. Si llama a este punto final inmediatamente después de comenzar el servidor, debe obtener esta respuesta en Postman:
{
"code": 200,
"message": "",
"result": {
"users": [
{
"age": 19,
"id": 1,
"name": "Aria",
"team": "LWB"
},
{
"age": 20,
"id": 2,
"name": "Tim",
"team": "LWB"
},
{
"age": 23,
"id": 3,
"name": "Varun",
"team": "NNB"
},
{
"age": 24,
"id": 4,
"name": "Alex",
"team": "C2TC"
}
]
},
"success": true
}
Defina el punto final:
GET /users/<id>
Esto debería recuperar a un solo usuario que tenga la id proporcionada de la solicitud.
Si no existe un usuario con el id proporcionado, devuelva un 404 con un message descriptivo.
Extienda el primer /users Enoint agregando la capacidad de consultar a los usuarios en función del equipo en el que se encuentran. No debe usar un parámetro URL como lo hizo en la Parte 2. En su lugar, use una cadena de consulta.
Si team se proporciona como un parámetro de cadena de consulta, solo devuelva a los usuarios que están en ese equipo. Si no hay usuarios en el team proporcionado, devuelva una lista vacía.
Para este ejercicio, puede ignorar los parámetros de cadena de consulta que no sea team .
En Postman, puede suministrar parámetros de cadena de consulta escribiendo la cadena de consulta en su URL de solicitud o presionando el botón Params junto a Send . Hacerlo completará automáticamente la URL de solicitud.
Lo siguiente debería suceder
GET /users?team=LWB
{
"code": 200,
"message": "",
"result": {
"users": [{
"age": 19,
"id": 1,
"name": "Aria",
"team": "LWB"
}, {
"age": 20,
"id": 2,
"name": "Tim",
"team": "LWB"
}]
},
"success": true
}

Defina el punto final:
POST /users
Este punto final debería crear un nuevo usuario. Cada solicitud también debe enviar un name , age y parámetro team en el body de la solicitud. La propiedad id se creará automáticamente en el MockDB.
Una solicitud exitosa debe devolver un código de estado de 201 y devolver al usuario recién creado.
Si no se proporcionan alguno de los tres parámetros requeridos, no cree un nuevo usuario en el DB y devuelva un 422 con un message útil. En general, sus mensajes deben proporcionar al usuario/desarrollador comentarios útiles sobre lo que hizo mal y cómo pueden solucionarlo.
Así es como puede enviar parámetros body desde Postman. ¡Asegúrese de no confundir esto con los parámetros de consulta! 
Defina el punto final:
PUT /users/<id>
Aquí necesitamos proporcionar una id de usuario ya que necesitamos especificar qué usuario actualizar. El body para esta solicitud debe contener los mismos atributos que la solicitud POST de la Parte 4.
Sin embargo, la diferencia con esta solicitud PUT es que solo se actualizarán los valores con las teclas proporcionadas ( name , age , team ), y cualquier parámetros no proporcionados no cambiará el atributo correspondiente en el usuario que se actualiza.
No necesita tener en cuenta los parámetros body siempre que no sean name , age o team .
Si no se puede encontrar el usuario con la id proporcionada, devuelva un 404 y un message útil.
Defina el punto final:
DELETE /users/<id>
Esto eliminará al usuario con la id asociada. Devuelva un message útil, aunque no es necesario especificar nada en el result de la respuesta.
Si no se puede encontrar el usuario con la id proporcionada, devuelva un 404 y un message útil.
¡Escribamos pruebas unitarias! Las pruebas unitarias son muy importantes para el desarrollo de software. Permite verificar automáticamente si nuestra funcionalidad funciona o no, ya que probar manualmente todo es muy lento y propenso a errores. El desarrollo impulsado por las pruebas es un proceso de desarrollo de software en el que definimos una especificación, escribimos pruebas a esa especificación, luego implementamos la funcionalidad y usamos las pruebas para validar si funciona. Hemos hecho un poco de eso por usted, ya que las pruebas para la Parte 1-3 están escritas. Para probarlos:
pipenv install --dev
pipenv run pytest
Si sus cambios funcionaron, debería ver una línea verde que dice 5 passed . Si no lo hacen, siga las trazas de la pila y arregle su implementación. Una vez que trabajan, escribamos pruebas para las partes 3-6 .
Utilizamos Pytest, un marco de prueba de Python útil que encuentra y ejecuta automáticamente métodos de Python que comienzan con test , como test_get_index . En nuestro caso, tenemos un archivo de prueba llamado test_app.py , que contiene todas las pruebas para las partes 1-3.
Cada método también acepta un objeto client , que Pytest inyecta automáticamente. client es un accesorio de prueba, que es algo que puede usar en múltiples pruebas, dándole una línea de base fija para sus pruebas. Al inicializar, Pytest mira a conftest.py y recoge todos los accesorios. En nuestro caso, tenemos un accesorio client , que le da a un cliente de prueba frascos, que podemos usar para probar fácilmente nuestra API. Busque cómo puede usar el cliente de prueba de Flask para hacer otros tipos de solicitudes y cómo puede usar la carga útil de la solicitud.
Cuando haya terminado con todos los pasos, ¡presione sus cambios a su repositorio de GitHub!
Corramos Black, un formateador de Python, antes de enviarlo. Esto elimina todos los argumentos sobre cómo queremos diseñar su código Python y brinda a los revisores un estilo estandarizado para revisar. Debe tenerlo instalado con pipenv install --dev
pipenv run black .
Antes de que pueda enviar un PR, tendrá que llevar su rama a una rama remota (la que está en Github, no local).
Verifique que esté en su rama:
git branch
Si desea asegurarse de que todos sus confirmaciones estén en:
git log
Presione Q para dejar la pantalla git log .
Empuje sus compromisos a su rama remota:
git push
La primera vez que hace esto, puede recibir un error ya que su rama remota aún no existe. Por lo general, le dirá el comando correcto para usar:
git push --set-upstream origin <YOUR_BRANCH_NAME>
Nota: Esto solo debe hacerse la primera vez que presiona una nueva rama. Puede usar solo git push después.
Una vez hecho esto, envíe un correo electrónico a [email protected] con el enlace a su repositorio bifurcado y el nombre de su rama. Necesitaremos estas dos cosas para ver su envío.