Maison  >  Article  >  développement back-end  >  Utilisation rapide de l'API REST par Python

Utilisation rapide de l'API REST par Python

Guanhui
Guanhuiavant
2020-06-15 18:15:245105parcourir

Utilisation rapide de l'API REST par Python

À la suggestion d'un collègue, nous avons décidé d'utiliser Fastapi comme framework.

Fastapi est un framework basé sur Python qui encourage l'utilisation de Pydantic et OpenAPI (anciennement Swagger) pour la documentation, Docker pour un développement et un déploiement rapides, ainsi que des tests simples basés sur le framework Starlette.

Il offre de nombreux avantages tels que la validation et la documentation automatiques d'OpenAPI sans ajouter de surcharge inutile. Je pense qu'il existe un bon équilibre entre ne fournir aucune fonctionnalité intégrée et fournir trop de fonctionnalités intégrées.

Démarrage

Installez fastapi et le serveur ASGI (par exemple uvicorn) :

Assurez-vous que vous utilisez Python 3.6.7+ Vous devrez peut-être utiliser pip et python si pip3 et python3 vous donnent une version python 2. Consultez également mon article sur la prise en main de Python.

pip install fastapi uvicorn

et ajoutez l'ancien "hello world" dans le fichier main.py :

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def home():
    return {"Hello": "World"}

Exécuter le développement

puis exécuter pour le développement, vous pouvez Exécutez uvicorn main:app --reload

C'est tout ce qu'un simple serveur fait ! Vous pouvez maintenant vérifier //localhost:8000/ pour voir la "Page d'accueil". Et, comme vous pouvez le constater, la réponse JSON « fonctionne tout simplement » ! Vous pouvez également obtenir l'interface utilisateur Swagger gratuitement sur //localhost:8000/docs.

Validation

Comme mentionné précédemment, il est facile de valider les données (et de générer une documentation Swagger pour les formats de données acceptés). Ajoutez simplement l'import Query depuis fastapi et utilisez-le pour forcer la validation :

from fastapi import FastAPI, Query

@app.get('/user')
async def user(
    *,
    user_id: int = Query(..., title="The ID of the user to get", gt=0)
):
  return { 'user_id': user_id }

Le premier paramètre ... est la valeur par défaut qui est fournie si l'utilisateur ne fournit pas de valeur. S'il est défini sur None, il n'y a pas de valeur par défaut et le paramètre est facultatif. Pour n'avoir aucune valeur par défaut et que le paramètre soit obligatoire, utilisez plutôt Ellipsis , ou ....

Si vous exécutez ce code, vous verrez automatiquement la mise à jour sur l'interface utilisateur swagger :

L'interface utilisateur Swagger vous permet d'afficher le nouvel itinéraire /user et utiliser spécifique Faire la demande avec un identifiant utilisateur

Si vous entrez un identifiant utilisateur, vous verrez qu'il effectuera automatiquement la demande pour vous, par exemple //localhost:8000/user?user_id=1. Dans la page, vous ne pouvez voir que l'ID utilisateur repris !

Si vous souhaitez utiliser le paramètre path à la place (pour qu'il soit /user/1), entrez simplement et utilisez Path au lieu de Query. Vous pouvez également combiner les deux

. Post route

Si vous avez une route POST alors définissez simplement l'entrée

@app.post('/user/update')
async def update_user(
    *,
    user_id: int,
    really_update: int = Query(...)
):
    pass

Dans ce cas vous pouvez voir que le user_id n'est défini que comme un sans Query ou un entier de Path ; cela signifie qu'il sera dans le corps de la requête POST. Si vous acceptez des structures de données plus complexes, telles que les données JSON, vous devriez examiner les modèles de requête et de réponse

. 🎜>

Vous pouvez documenter et déclarer des modèles de demande et de réponse détaillés à l'aide des modèles Pydantic. Non seulement cela vous permet d'avoir une documentation OpenAPI automatique pour tous vos modèles, mais cela valide également les modèles de demande et de réponse pour garantir la saisie. . Toutes les données POST seront correctes et les données renvoyées seront également conformes au modèle

Déclarez simplement le modèle comme ceci :

from pydantic import BaseModel

class User(BaseModel):
    id:: int
    name: str
    email: str
Ensuite, si vous voulez le modèle utilisateur en entrée, vous pouvez le faire. ce qui suit :

async def update_user(*, user: User):
    pass
Ou si vous souhaitez l'utiliser comme sortie :

@app.get('/user')
async def user(
    *,
    user_id: int = Query(..., title="The ID of the user to get", gt=0),
    response_model=User
):
  my_user = get_user(user_id)
  return my_user

Acheminer et décomposer une API plus grande

Vous L'API pouvez être divisé en itinéraires en utilisant

Par exemple, j'ai trouvé ceci dans mon API APIRouterapp / routers / v1 / __ init __。py

from fastapi import APIRouter
from .user import router as user_router

router = APIRouter()

router.include_router(
    user_router,
    prefix='/user',
    tags=['users'],
)
alors vous pouvez utiliser le code utilisateur ci-dessus dans

- importez simplement app / routers / v1 / user.py et utilisez au lieu de APIRouter. Il acheminera automatiquement vers @ router.get('/')< aaaa> car l'itinéraire est relatif au préfixe @ app.get('/ user')

from fastapi import APIRouter

router = APIRouter()

@router.get('/')
async def user(
    *,
    user_id: int = Query(..., title="The ID of the user to get", gt=0),
    response_model=User
):
  my_user = get_user(user_id)
  return my_user
/ user / Enfin, utilisez tous les routeur, modifiez simplement pour :

from fastapi import FastAPI
from app.routers import v1

app = FastAPI()

app.include_router(
    v1.router,
    prefix="/api/v1"
)
v1 Vous pouvez chaîner les routeurs à volonté de cette façon, ce qui vous permet de diviser les grandes applications et de disposer d'API versionnées main.py

Dockerisation et déploiement

One. des choses que les auteurs de Fastapi ont faites est la Dockerisation étonnamment facile ! La valeur par défaut est de 2 lignes !
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.7

COPY ./app /app

是否想通过自动重新加载进行 Dockerize 开发?这是我在撰写文件中使用的秘方:

version: "3"
services:
  test-api:
    build: ..
    entrypoint: '/start-reload.sh'
    ports:
        - 8080:80
    volumes:
        - ./:/app

这会将当前目录挂载为app并将在任何更改时自动重新加载。您可能还想将app / app用于更大的应用程序。

有用的网址

所有这些信息都来自 Fastapi网站,该文档具有出色的文档,我鼓励您阅读。此外,作者在 Gitter 上非常活跃并乐于助人!

结论

就是这样-我希望本指南对您有所帮助,并且您会像我一样喜欢使用 Fastapi。

推荐教程:Python教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer