Mise à jour de la configuration de la base de données pour utiliser PostgreSQL et ajout de Redis dans le fichier .env. Modifications du Dockerfile pour installer les dépendances nécessaires. Amélioration des services de stockage pour supporter les opérations asynchrones avec S3 et le stockage local. Refactorisation des pipelines d'images pour une meilleure gestion des tâches asynchrones. Ajout de la gestion des clés API dans l'authentification. Mise à jour de la documentation et des exemples d'utilisation.
This commit is contained in:
@@ -22,12 +22,6 @@ import asyncio
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def _run_sync_in_thread(func: Any, *args: Any) -> Any:
|
||||
"""Exécute une fonction synchrone dans un thread pour ne pas bloquer l'event loop."""
|
||||
loop = asyncio.get_event_loop()
|
||||
return await loop.run_in_executor(None, func, *args)
|
||||
|
||||
|
||||
async def _publish_event(
|
||||
redis: Any, image_id: int, event: str, data: dict | None = None
|
||||
) -> None:
|
||||
@@ -48,8 +42,8 @@ async def process_image_pipeline(
|
||||
) -> None:
|
||||
"""
|
||||
Pipeline complet de traitement d'une image :
|
||||
1. Extraction EXIF (sync → thread)
|
||||
2. OCR — extraction texte (sync → thread)
|
||||
1. Extraction EXIF (async)
|
||||
2. OCR — extraction texte (async)
|
||||
3. Vision AI — description + tags (async)
|
||||
4. Sauvegarde finale en BDD
|
||||
|
||||
@@ -81,7 +75,9 @@ async def process_image_pipeline(
|
||||
try:
|
||||
logger.info("pipeline.step.start", extra={"image_id": image_id, "step": "exif", "step_num": "1/3"})
|
||||
t0 = time.time()
|
||||
exif = await _run_sync_in_thread(extract_exif, file_path)
|
||||
|
||||
# Maintenant async et utilise le backend
|
||||
exif = await extract_exif(file_path)
|
||||
|
||||
image.exif_raw = exif.get("raw")
|
||||
image.exif_make = exif.get("make")
|
||||
@@ -117,7 +113,9 @@ async def process_image_pipeline(
|
||||
try:
|
||||
logger.info("pipeline.step.start", extra={"image_id": image_id, "step": "ocr", "step_num": "2/3"})
|
||||
t0 = time.time()
|
||||
ocr = await _run_sync_in_thread(extract_text, file_path)
|
||||
|
||||
# Maintenant async et utilise le backend
|
||||
ocr = await extract_text(file_path)
|
||||
|
||||
# Fallback AI si OCR classique échoue ou ne trouve rien
|
||||
if not ocr.get("has_text", False):
|
||||
|
||||
Reference in New Issue
Block a user