[PYTHON] Kombinieren Sie Fast API mit Django ORM

Motivation

Es scheint, dass FastAPI in letzter Zeit mit Momentum of Breaking Bamboo gewachsen ist.

Ich möchte mit FastAPI von Django flirten, aber ich möchte weiterhin Django und sein Benutzersystem verwenden. Es sieht gierig aus, aber es ist wirklich so eine gute Sache. Dieses Mal werde ich erklären, wie man Django ORM und FastAPI kombiniert.

Natürlich gibt es auch Nachteile. In Bezug auf die Leistung kann die Async IO-Unterstützung von ORM nicht verwendet werden. Wenn Sie die Leistung verbessern möchten, können Sie ein Modell wie orm separat erstellen.

Ordnerstruktur

Lassen Sie uns zunächst über die Ordnerstruktur sprechen. Sie können den Inhalt des Ordners basierend auf dem Lernprogramm in der Django-Dokumentation erstellen. Weitere Informationen finden Sie unter hier.

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

Löschen Sie nach dem Generieren der Datei views.py und models.py und bereiten Sie einen Ordner für FastAPI vor, wie unten gezeigt.

$ 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

Verwendung jedes Ordners richtig:

--models Ordner: Django ORM

Daten vorbereiten

Lesen Sie Django-Dokument und versuchen Sie, die Daten einzugeben.

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

FastAPI eingeführt

Fügen Sie der Einfachheit halber das folgende Beispiel in den Ordner "__init __. Py" ein. Lassen Sie auch "Import" weg.

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

Start der FastAPI-App zu mysite / asgi.py hinzugefügt.

from fastapi import FastAPI
from polls.routers import router

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

Starten

Erstellen Sie zunächst eine statische Datei für uvicorn:

$ python manage.py collectstatic --noinput

FastAPI wird mit uvicorn mysite.asgi: fastapp --reload und Django mit uvicorn mysite.asgi: application --port 8001 --reload gestartet.

Greifen Sie auf "http: //127.0.0.1: 8000 / docs /" für das FastAPI-Dokument und auf "http: //127.0.0.1: 8001 / admin /" für den Django-Administratorbildschirm zu.

Zusammenfassung

Die Kombination von FastAPI und Django ORM ist überraschend einfach. Wenn Sie den Integrationsteil gut aufteilen, können Sie eine übersichtliche Ordnerstruktur erstellen.

Der obige Code befindet sich in meinem Github.

Recommended Posts

Kombinieren Sie Fast API mit Django ORM
Kombiniere zwei Bilder mit Django
Internationalisierung mit Django
CRUD mit Django
Authentifizieren Sie Google mit Django
Django 1.11 wurde mit Python3.6 gestartet
Laden Sie Dateien mit Django hoch
Entwicklungsverdauung mit Django
PDF mit Django ausgeben
Markdown-Ausgabe mit Django
Verwenden Sie Gentelella mit Django
Twitter OAuth mit Django
Mail mit Django senden
Datei-Upload mit Django
Verwenden Sie WENIGER mit Django
Pooling mechanisieren mit Django
Verwenden Sie MySQL mit Django
Django ab heute
Erste Schritte mit Django 2
Fangen Sie mit Django an! ~ Tutorial ⑤ ~
Erstellen Sie eine API mit Django
Mach Django mit CodeStar (Python3.8, Django2.1.15)
Stellen Sie Django serverlos mit Lambda bereit
Python3 + Django ~ Mac ~ mit Apache
So überprüfen Sie das Verhalten von ORM mit einer Datei mit django
Erste Schritte mit Python Django (1)
Erstellen Sie eine Homepage mit Django
Fangen Sie mit Django an! ~ Tutorial ④ ~
Erste Schritte mit Python Django (4)
Erstellen Sie eine Webanwendung mit Django
Erste Schritte mit Python Django (3)
Fangen Sie mit Django an! ~ Tutorial ⑥ ~
Verwenden Sie Django, um Tweet-Daten zu speichern
Führen Sie eine AES-Verschlüsselung mit DJango durch
Einführung in Python Django (6)
Erste Schritte mit Django mit PyCharm
Echtzeit-Web mit Django-Kanälen
Doppelte Submit-Unterdrückung mit Django
Django REST Framework mit Vue.js
Verwenden Sie prefetch_related bequem mit Django
Erste Schritte mit Python Django (5)
Melden Sie sich mit dem Django Rest Framework an
Qiita API Oauth mit Django
Testgetriebene Entwicklung mit Django Teil 3
Erstellen Sie FastAPI + uvicorn + nginx mit Docker-Compose
Laden Sie die Django-Shell mit ipython neu
Schritte zur Entwicklung von Django mit VSCode
Testgetriebene Entwicklung mit Django Teil 4
Laden Sie ein Django-Modul mit einem Interpreter
Richten Sie mit Django ein soziales Login ein
Testgetriebene Entwicklung mit Django Teil 6
Verwalten Sie Django-Konfigurationsdateien mit Python-Decouple
Stellen Sie die Django-Anwendung mit Docker bereit
Standardisieren Sie HTML, um mit Django gemietet zu werden
Linke äußere Verbindung im Django-Modell
Testgetriebene Entwicklung mit Django Teil 2
Django-Tipps - Erstellen Sie eine Ranking-Site mit Django-
Twitter-Posting-Anwendung mit Django gemacht
Generieren Sie automatisch ein Modellbeziehungsdiagramm mit Django
Wie fange ich mit Django an?
Führen Sie python3 Django1.9 mit mod_wsgi aus (deploy)