Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.
Ambdós costats versió prèvia Revisió prèvia Següent revisió | Revisió prèvia | ||
fastapi [2023/06/21 14:19] 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:// | + | Referències teoria i documentació: |
+ | [[https:// | ||
- | **Instal·lació** | + | |
+ | |||
+ | =====Instal·lació===== | ||
Línia 21: | Línia 25: | ||
</ | </ | ||
- | **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' | ||
<file python main.py> | <file python main.py> | ||
from fastapi import FastAPI | from fastapi import FastAPI | ||
app = FastAPI() | app = FastAPI() | ||
+ | @app.get("/ | ||
+ | def index(): | ||
+ | return {" | ||
</ | </ | ||
+ | |||
+ | < | ||
+ | uvicorn main:app --reload | ||
+ | </ | ||
<WRAP center round tip 10> | <WRAP center round tip 10> | ||
- | tip box | + | La comanda arranca el servidor uvicorn amb el fitxer main.py. Amb el flag --reload el servidor detecta les modificacions que guardem al codi i es reeinicia. |
</ | </ | ||
- | **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ó, |
+ | En aquesta ruta ens mostra la documentació amb el format [[https:// | ||
- | [[https://fastapi.tiangolo.com/ | + | {{::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("/ | ||
+ | async def student_info(id: | ||
+ | ..... | ||
+ | ..... | ||
+ | | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Query parameters==== | ||
+ | Son paràmetres del tipus clau-valor i s' | ||
+ | |||
+ | <WRAP center round box 100%> | ||
+ | http:// | ||
+ | </ | ||
+ | |||
+ | <file python main.py> | ||
+ | @app.get("/ | ||
+ | async def get_students(skip: | ||
+ | .... | ||
+ | .... | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====Default parameters==== | ||
+ | Seguint amb l' | ||
+ | |||
+ | En el següent exemple, els valors per defecte dels dos paràmetres, | ||
+ | |||
+ | <WRAP center round box 100%> | ||
+ | http:// | ||
+ | </ | ||
+ | |||
+ | <file python main.py> | ||
+ | @app.get("/ | ||
+ | async def get_students(skip: | ||
+ | .... | ||
+ | .... | ||
+ | </ | ||
+ | |||
+ | ====Optional parameters==== | ||
+ | Podem declarar paràmetre opcionals, ja siguin paràmtres de la //query// o per //path//. Per fer-ho, necessitem importar el tipus // | ||
+ | <file python main.py> | ||
+ | from typing import Optional | ||
+ | |||
+ | @app.get("/ | ||
+ | async def chek_student(id: | ||
+ | .... | ||
+ | .... | ||
+ | </ | ||
+ | =====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:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | |||
+ | Primer s'ha d' | ||
+ | <WRAP center round box 100%> | ||
+ | **pip install jinja2** | ||
+ | </ | ||
+ | |||
+ | Per utilitzar les plantilles s'han d' | ||
+ | |||
+ | 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' | ||
+ | Si ens fixem en la resposta de l'// | ||
+ | |||
+ | <file python main.py> | ||
+ | from fastapi.templating import Jinja2Templates | ||
+ | from fastapi.staticfiles import StaticFiles | ||
+ | |||
+ | templates = Jinja2Templates(directory=" | ||
+ | |||
+ | app = FastAPI() | ||
+ | |||
+ | app.mount("/ | ||
+ | |||
+ | @app.get("/ | ||
+ | async def ruckus(request: | ||
+ | .... | ||
+ | devices = db.query(models.Ruckus).order_by(models.Ruckus.id.desc()) | ||
+ | return templates.TemplateResponse(" | ||
+ | {" | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | Com podem veure en el fitxer index.html podem tenir un fitxer principal o base (en el cas de l' | ||
+ | En la resposta de la API estem tornant un array d' | ||
+ | |||
+ | <file html index.html> | ||
+ | {% extends ' | ||
+ | |||
+ | {% block content %} | ||
+ | < | ||
+ | |||
+ | <div class=" | ||
+ | <div class=" | ||
+ | <div class=" | ||
+ | {% for device in devices %} | ||
+ | <div class=" | ||
+ | {% if device.connected%} | ||
+ | <div class=" | ||
+ | {% else %} | ||
+ | <div class=" | ||
+ | {% endif %} | ||
+ | <div class=" | ||
+ | <h5 class=" | ||
+ | < | ||
+ | < | ||
+ | <a href=" | ||
+ | <a href=" | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | {% endfor %} | ||
+ | |||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | {% endblock content %} | ||
+ | </ |