• Mémo Context manager : Environnement Django

  • Recreate Django environment with context manager

Je tombe à chaque fois sur cette erreur en scriptant rapidement une opération rapide en environnement Django, par exemple, une requête en base de données : django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

Woopsie!

Rien de tel qu'un context manager pour faire un petit patch.

class DjangoEnvironment:

    def __init__(self, application):
        self.application = application

    def __enter__(self):
        print(f"Setup Django environment with app {self.application}")
        import os
        import django
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", self.application)
        django.setup()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(f"Quit Django environment with app {self.application}")
        del self


with DjangoEnvironment("AppScraper.settings.production") as env:
    from books.models import Book
    book = Book.objects.get(pk=1)
    print(f"Title: {book.title}")

En sortie :

Setup Django environment with app app.settings.production
Title: Hello, World! 
Quit Django environment with app app.settings.production


22 novembre 2019 17:52