Combinez Fast API avec Django ORM

Motivation

Il semble que FastAPI se soit développé récemment avec Momentum of Breaking Bamboo.

Je veux flirter avec FastAPI de Django, mais je veux continuer à utiliser Django et son système utilisateur. Cela a l'air gourmand, mais c'est en fait une si bonne chose. Cette fois, je vais vous expliquer comment combiner Django ORM et FastAPI.

Bien sûr, il y a aussi des inconvénients. En termes de performances, le support Async IO d'ORM ne peut pas être utilisé. Si vous souhaitez améliorer les performances, vous pouvez créer un modèle tel que orm séparément.

Structure des dossiers

Parlons d'abord de la structure des dossiers. Vous pouvez créer le contenu du dossier en vous basant sur le tutoriel de la documentation Django. Pour plus de détails, voir ici.

$ django-admin startproject mysite
$ django-admin startapp poll

Après avoir généré le fichier, supprimez views.py et models.py et préparez un dossier pour FastAPI comme indiqué ci-dessous.

$ tree -L 3 -I '__pycache__|venv' -P '*.py'
.
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── polls
    ├── __init__.py
    ├── adapters
    │   └── __init__.py
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   └── __init__.py
    ├── models
    │   └── __init__.py
    ├── routers
    │   └── __init__.py
    ├── schemas
    │   └── __init__.py
    └── tests.py

7 directories, 15 files

Utilisation correcte de chaque dossier:

Préparez les données

Reportez-vous au Document Django et essayez d'entrer les données.

>>> from polls.models import Choice, Question
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
>>> q.save()

Introduction de FastAPI

Pour plus de simplicité, placez l'exemple ci-dessous dans le dossier «__init __. Py». Omettez également «import».

schemas

class FastQuestion(BaseModel):
    question_text: str
    pub_date: datetime

    @classmethod
    def from_model(cls, instance: Question):
        return cls(
            id=instance.id,
            question_text=instance.question_text,
            pub_date=instance.pub_date,
        )


class FastQuestions(BaseModel):
    items: List[FastQuestion]

    @classmethod
    def from_qs(cls, qs):
        return cls(items=[FastQuestion.from_model(i) for i in qs])

adapters

ModelT = TypeVar("ModelT", bound=models.Model)


def retieve_object(model_class: Type[ModelT], id: int) -> ModelT:
    instance = model_class.objects.filter(pk=id).first()
    if not instance:
        raise HTTPException(status_code=404, detail="Object not found.")
    return instance


def retrieve_question(
    q_id: int = Path(..., description="retrive question from db")
) -> Question:
    return retieve_object(Question, q_id)


def retrieve_questions():
    return Question.objects.all()

routers

@router.get("/")
def get_questions(
    questions: List[Question] = Depends(adapters.retrieve_questions),
) -> FastQuestions:
    return FastQuestions.from_qs(questions)


@router.get("/{q_id}")
def get_question(
    question: Question = Depends(adapters.retrieve_question),
) -> FastQuestion:
    return FastQuestion.from_model(question)

asgi.py

Ajout du lancement de l'application FastAPI à mysite / asgi.py.

from fastapi import FastAPI
from polls.routers import router

fastapp = FastAPI()
fastapp.include_router(router, tags=["questions"], prefix="/question")

lancement

Tout d'abord, créez un fichier statique pour ʻuvicorn`:

$ python manage.py collectstatic --noinput

FastAPI est lancé avec ʻuvicorn mysite.asgi: fastapp --reload, et Django avec ʻuvicorn mysite.asgi: application --port 8001 --reload.

Accédez à http: //127.0.0.1: 8000 / docs / pour le FastAPI Doc ethttp: //127.0.0.1: 8001 / admin /pour l'écran d'administration de Django.

Résumé

La combinaison de FastAPI et Django ORM est étonnamment facile, et si vous divisez bien la partie d'intégration, vous pouvez créer une structure de dossier soignée.

Le code ci-dessus peut être trouvé dans mon Github.

Recommended Posts

Combinez Fast API avec Django ORM
Combinez deux images avec Django
Internationalisation avec Django
CRUD avec Django
Authentifier Google avec Django
Django 1.11 a démarré avec Python3.6
Télécharger des fichiers avec Django
Résumé du développement avec Django
Sortie PDF avec Django
Sortie Markdown avec Django
Utiliser Gentelella avec Django
Twitter OAuth avec Django
Envoyer des e-mails avec Django
Téléchargement de fichiers avec django
Utilisez LESS avec Django
La mutualisation mécanise avec Django
Utiliser MySQL avec Django
Django à partir d'aujourd'hui
Premiers pas avec Django 2
Lancez-vous avec Django! ~ Tutoriel ⑤ ~
Créer une API avec Django
Faites Django avec CodeStar (Python3.8, Django2.1.15)
Déployer Django sans serveur avec Lambda
Python3 + Django ~ Mac ~ avec Apache
Comment vérifier le comportement d'ORM avec un fichier avec django
Premiers pas avec Python Django (1)
Créer une page d'accueil avec django
Lancez-vous avec Django! ~ Tutoriel ④ ~
Premiers pas avec Python Django (4)
Créer une application Web avec Django
Premiers pas avec Python Django (3)
Lancez-vous avec Django! ~ Tutoriel ⑥ ~
Utilisez Django pour enregistrer les données de tweet
Effectuer le cryptage AES avec DJango
Introduction à Python Django (6)
Premiers pas avec Django avec PyCharm
Web en temps réel avec les chaînes Django
Suppression de double envoi avec Django
Framework Django REST avec Vue.js
Utilisez prefetch_related commodément avec Django
Premiers pas avec Python Django (5)
Connectez-vous avec Django Rest Framework
Qiita API Oauth avec Django
Développement piloté par les tests avec Django Partie 3
Construisez FastAPI + uvicorn + nginx avec docker-compose
recharger dans le shell django avec ipython
Étapes pour développer Django avec VSCode
Développement piloté par les tests avec Django Partie 4
Charger les modules Django avec un interpréteur
Configurer la connexion sociale avec Django
Développement piloté par les tests avec Django Partie 6
Gérer les fichiers de configuration Django avec Python-decouple
Déployer l'application Django avec Docker
Standardiser le HTML à louer avec Django
Jointure externe gauche dans le modèle Django
Développement piloté par les tests avec Django Partie 2
Django Tips-Créez un site de classement avec Django-
Application de publication sur Twitter réalisée avec Django
Générer automatiquement un diagramme de relation de modèle avec Django
Comment démarrer avec Django
Exécutez python3 Django1.9 avec mod_wsgi (déployer)