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.
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
schemas
Ordner: FastAPI Pydantic ValidatorLesen 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()
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")
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.
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