bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


fastapi

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
fastapi [2023/06/21 14:39]
xavier_fibla_agustin
fastapi [2023/06/28 16:03] (actual)
xavier_fibla_agustin [Requests i responses]
Línia 1: Línia 1:
 ====== FastAPI ====== ====== FastAPI ======
  
 +----
  
-[[https://fastapi.tiangolo.com/]]+Referències teoria i documentació:
  
 +[[https://fastapi.tiangolo.com/|Documentació oficial FastAPI]]
  
-**Instal·lació**+ 
 + 
 +=====Instal·lació=====
  
  
Línia 21: Línia 25:
 </WRAP> </WRAP>
  
-**Aplicació simple**+ 
 + 
 +=====Aplicació simple===== 
 + 
 +Per a crear una API molt simple que ens mostri un missatge només necessitem importar la llibreria del FastAPI 
 +i defenir un mètode; en aquest cas li definim una ruta d'accés "/api/index" que ens retornarà el missatge. 
 <file python main.py> <file python main.py>
 from fastapi import FastAPI from fastapi import FastAPI
Línia 40: Línia 50:
  
  
-**REST APIs** 
  
  
 +=====REST APIs=====
  
-**Swagger OpenAPI**+Representation State Transfer (REST) API 
  
 +  * GET
 +  * POST
 +  * DELETE
 +  * PUT
 +  * PATCH
 +  
  
 +Tots aquestes operacions estan disponible estan disponibles amb el decordaro @app. Per exemple @app.get()
  
-** Requests i responses ** 
  
  
 +=====Swagger OpenAPI=====
  
-** Templates **+Al arrancar el servidor uvicorn poden veure totes les URLs que estan disponibles a la nostra API accedin a la URL de la documentació, http://localhost:8000/docs. 
  
 +En aquesta ruta ens mostra la documentació amb el format [[https://www.openapis.org/|OpenAPI]], mostrant tots els mètodes de la nostra API on també els podem provar.
  
-[[https://fastapi.tiangolo.com/advanced/templates/]]+{{::fastapi-swagger-ui-simple.png?400|}}
  
 +
 +
 +
 +
 +=====Requests i responses=====
 +
 +
 +====Path parameters====
 +FastAPI ens permet obtenir dades dinàmiques de les peticions directament de la URL:
 +
 +<file python main.py>
 +@app.get("/student/{id}")
 +async def student_info(id:UUID):
 +.....
 +.....
 +    
 +</file>
 +
 +
 +====Query parameters====
 +Son paràmetres del tipus clau-valor i s'afegeixen al final de la URL, comencen a partir del signe de pregunta ?. Es poden anar afegint parametres separats pel símbol &. Per exemple:
 +
 +<WRAP center round box 100%>
 +http://localhost:8000/sudents/?skip=0&limit=10
 +</WRAP>
 +
 +<file python main.py>
 +@app.get("/students/")
 +async def get_students(skip: int, limit: int):
 +....
 +....
 +</file>
 +
 +
 +====Default parameters====
 +Seguint amb l'exemple anterior, podem assignar un valor per defecte als paràmtres, d'aquesta forma podem evitar les validacions de parametre requerit.
 +
 +En el següent exemple, els valors per defecte dels dos paràmetres, estan declarats en la definició del mètode de la API.
 +
 +<WRAP center round box 100%>
 +http://localhost:8000/sudents/?skip=0&limit=10
 +</WRAP>
 +
 +<file python main.py>
 +@app.get("/students/")
 +async def get_students(skip: int = 0, limit: int = 10):
 +....
 +....
 +</file>
 +
 +====Optional parameters====
 +Podem declarar paràmetre opcionals, ja siguin paràmtres de la //query// o per //path//. Per fer-ho, necessitem importar el tipus //Optional// del mòdul //typing// 
 +<file python main.py>
 +from typing import Optional
 +
 +@app.get("/student/check")
 +async def chek_student(id: Optional[UUID]=None):
 +....
 +....
 +</file>
 +=====Templates=====
 +FastAPI pot integrar el motor de plantilles Jinja on podem utilitzar una sintaxi semblant a Python, és molt semblant al motor de plantilles de Django.
 +
 +Referències teoria i documentació:
 +[[https://fastapi.tiangolo.com/advanced/templates/| jinja2 Templates ]]
 +
 +[[https://jinja.palletsprojects.com/en/3.1.x/|jinja ]]
 +
 +
 +Primer s'ha d'instal·lar:
 +<WRAP center round box 100%>
 +**pip install jinja2**
 +</WRAP>
 +
 +Per utilitzar les plantilles s'han d'importar les llibreries com veiem al fitxer main.py. En aquest exemple li estem dient que totes plantilles estan en una carpeta anmenada //templates//. Dintre d'aquesta estan tots els fitxers html.
 +
 +També podem carregar fitxer estàtics com poden ser els css, en aquest cas tenim un carpeta anomenada //static// on tenim les nostres fulles d'estils que després utilitzen les plantilles html.
 +Si ens fixem en la resposta de l'//endpoint// @app.get("/devices") veiem que retorna un tipus de resposta //TemplateResponse// especificant quina plantilla utilitzar i passant-li els objectes //request// i //devices// que després podem utilizar en la plantilla per mostrar informació.
 +
 +<file python main.py>
 +from fastapi.templating import Jinja2Templates
 +from fastapi.staticfiles import StaticFiles
 +
 +templates = Jinja2Templates(directory="templates")
 +
 +app = FastAPI()
 +
 +app.mount("/static", StaticFiles(directory="static"), name="static")
 +
 +@app.get("/devices")
 +async def ruckus(request: Request, db: Session = Depends(get_db)):
 +    ....
 +    devices = db.query(models.Ruckus).order_by(models.Ruckus.id.desc())
 +    return templates.TemplateResponse("index.html", 
 +    {"request": request, "devices": devices})
 +
 +</file>
 +
 +
 +Com podem veure en el fitxer index.html podem tenir un fitxer principal o base (en el cas de l'exemple és la primera línia {% extends 'base.html' %}) i anar afegint vistes sobre aquest.
 +En la resposta de la API estem tornant un array d'objecte (//devices//) que es el que utilitzem per mostrar la informació en el //for// de la plantilla; podent accedir a les diferents propietats i podent posar la lògica de presentació que sigue necessària.
 +
 +<file html index.html>
 +{% extends 'base.html' %}
 +
 +{% block content %}
 +<h2>Dispositius</h2>
 +
 +<div class="py-5">
 +    <div class="container">
 +        <div class="row hidden-md-up">
 +            {% for device in devices %}
 +            <div class="col-md-4">
 +                {% if device.connected%}
 +                <div class="card ok">
 +                    {% else %}
 +                    <div class="card danger">
 +                        {% endif %}
 +                        <div class="card-body">
 +                            <h5 class="card-title">{{ device.ip }}</h5>
 +                            <h6>{{device.hostname}}</h6>
 +                            <h6>{{device.student}}</h6>
 +                            <a href="edit/{{ device.ip }}">Edit</a>
 +                            <a href="delete/{{ device.ip }}">Delete</a>
 +                        </div>
 +
 +                    </div>
 +                </div>
 +                {% endfor %}
 +
 +            </div>
 +        </div>
 +    </div>
 +
 +
 +    {% endblock content %}
 +</file>
fastapi.1687358391.txt.gz · Darrera modificació: 2023/06/21 14:39 per xavier_fibla_agustin