Un échantillon de code bien pratique que je ne cesse d’oublier.
from datetime import datetime, timezone
now = datetime.now(tz=timezone.utc)
print(now.astimezone().isoformat())
Un échantillon de code bien pratique que je ne cesse d’oublier.
from datetime import datetime, timezone
now = datetime.now(tz=timezone.utc)
print(now.astimezone().isoformat())
L’équivalent FastAPI de vérifier-que-les-événements-proviennent-de-stripe
import os
from http import HTTPStatus
from typing import Annotated
import stripe
from fastapi import Depends, FastAPI, Header, HTTPException, Request
app = FastAPI()
async def get_body(request: Request) -> bytes:
return await request.body()
@app.post("/webhook", status_code=HTTPStatus.NO_CONTENT)
def post_report(
stripe_signature: Annotated[str, Header(alias="stripe-signature")],
body: bytes = Depends(get_body),
) -> None:
endpoint_secret = os.environ["ENDPOINT_SECRET"]
try:
# signature validation
event = stripe.Webhook.construct_event(body, stripe_signature, endpoint_secret)
except ValueError as e:
# Invalid payload
raise HTTPException(status_code=HTTPStatus.BAD_REQUEST) from e
except stripe.error.SignatureVerificationError as e:
# Invalid signature
raise HTTPException(status_code=HTTPStatus.UNPROCESSABLE_ENTITY) from e
print(event)
return
Un problème possible, que j’ai rencontré, est que j’ai demandé à FastAPI de convertir request.body
en un dictionnaire au niveau des paramètres de fonction (donc body: dict
). Puis, je l’ai sérialisé en une chaîne de caractères pour l’étape de validation… et cela a échoué parce qu’il n’était plus identique à ce qui était entré.
Lors d’une revue de code, un collègue, Zachary Paden, me demandait pourquoi j’appelais la fonction typing.cast
sur mes variables plutôt que de créer des variables temporaires simplement pour typer. Eh bien, tout comme il ignorait l’existence de cast
, j’ignorais que cette approche fonctionnait. En bon nerdz que nous sommes, il a décidé de mesurer la performance de chacune des approches.
Aujourd’hui, à la suggestion d’un collège (Zachary Paden), j’ai contemplé l’idée de migrer mes tests utilisant pytest/monkeypatch à moto. Ici je vais partager mon parcours et observations.
Continue reading « boto3 – Passer de monkeypatch à moto »Dans cet article, je vais expliquer comment créer un modèle pydantic pour valider et créer des polygones pour des SIG (systèmes d’information géographique).
Continue reading « Créer un modèle pydantic pour les polygones SIG »Pour ceux qui sont habitués à utiliser un environnement virtuel «de base» avec virtualenv, poetry peut être déroutant. Voici quelques éclaircissements et certains trucs avec l’utilisation de poetry.
Continue reading « Explications et astuces d’utilisation de python poetry »Voici tout simplement comment je m’y suis pris pour intégrer mypy dans quelques projets. Ce billet suppose que vous utilisez git et que vous avez un système de tests en place.
Continue reading « Comment intégrer mypy dans un projet existant »