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/28 15:02]
xavier_fibla_agustin [Swagger OpenAPI]
fastapi [2023/06/28 16:03] (actual)
xavier_fibla_agustin [Requests i responses]
Línia 80: Línia 80:
  
 =====Requests i responses===== =====Requests i responses=====
-PENDENT 
  
  
 +====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===== =====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ó: Referències teoria i documentació:
 [[https://fastapi.tiangolo.com/advanced/templates/| jinja2 Templates ]] [[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.1687964528.txt.gz · Darrera modificació: 2023/06/28 15:02 per xavier_fibla_agustin