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é.
La documentation de serverless indique comment partager les ids d’un API Gateway, mais la technique qui y est décrite ne semble fonctionner que pour un nouveau déploiement. (Dans mon cas, suivre cette technique a crée un 2è API Gateway vide dont les ids étaient partagés, ce qui, évidemment, ne répondait pas à mes besoins.)
Voici comment faire pour un déploiement existant.
Continue reading « Serverless: Comment partager les ids d’un API Gateway existant »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 »Depuis que j’ai fait le mois sans alcool en février dernier, j’ai pris conscience d’à quel point la consommation d’alcool a un impact sur la qualité de mon sommeil. En en prenant moins, je dors mieux et suis donc plus en forme.
Par chance, de nos jours, il y a une quantité surprenante de bières sans alcool disponibles. Je peux donc diminuer ma consommation d’alcool tout en continuant de boire de bonnes bières.
Alors voici mes recommendations, en images et peu de mots.
Continue reading « Mes recommendations de bières sans alcool, édition Septembre 2022 »En avril dernier, j’ai écrit un billet sur la gestion de boto3 dans les paquets déployés. (Voir Minimiser la taille de ses lambdas en évitant d’avoir boto3 et ses stubs dans le paquet à déployer.) Cette approche fonctionne lorsque toutes les dépendances peuvent être dans la section développement.
Mais, qu’en est-il lorsque des dépendances sont requises en production? Par exemple, nous avons récemment eu à déployer un lambda qui dépend d’awswrangler. La technique suggérée dans le précédent billet ne fonctionnait donc pas. Ici, je vais couvrir une approche différente qui permet de supprimer boto3 du paquet à déployer dans le contexte cité en exemple. Elle est cependant moins flexible et se base sur une technologie spécifique: serverless.
Continue reading « Minimiser la taille de ses lambdas en supprimant boto3 du paquet à déployer »J’ai récemment décidé de publier mes articles en français et en anglais. Au préalable, je devais trouver et tester des plugins afin d’en choisir un. J’ai donc passé du temps, plus que je ne l’aurais cru, à le faire fonctionner localement à travers Docker. Comme j’ai rencontré quelques pièges, j’ai décidé de partager la recette.
Continue reading « Recette: Exécuter une copie locale d’un site WordPress avec Docker »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 »Si vous avez des problèmes de lambdas AWS qui excèdent la limite de 250Mo, voici une astuce qui pourrait vous aider.
Continue reading « Minimiser la taille de ses lambdas en évitant d’avoir boto3 et ses stubs dans le paquet à déployer »