본문 바로가기

개발하자

Fast를 사용할 수 있습니까?장고랑 API?

반응형

Fast를 사용할 수 있습니까?장고랑 API?

저는 Django 개발자로 최근 FastAPI 프레임워크를 우연히 발견했습니다.

그리고 나서 나는 그것을 해보기로 결심했다. 그러나 일반적으로 Django와 함께 RESTful API를 구축하는 것에 대해 이야기할 때 Django Rest Framework(DRF)를 사용합니다.

DRF를 Fast로 대체할 수 있는지 아는 사람 있습니까?ORM과 같은 Django 권한을 사용하는 API로 여전히 모든 Fast에 액세스할 수 있습니다.API의 기능?

지금까지 나는 이것에 대한 단 하나의 기사를 발견했다. 그러나 통합 과정에서 저자는 FastAPI의 대부분의 기능을 잃었다.

FastAPI 문서에서는 특정 요청을 WSGI 응용 프로그램으로 리디렉션할 수 있다고 언급합니다.


단답형

네, 같이요.

예를 들어 모든 Django 기능을 사용할 수 있습니다. (예, 관리자도) 이 예제 코드와 함께 장착합니다.

import os from importlib.util import find_spec  from configurations.wsgi import get_wsgi_application from fastapi import FastAPI from fastapi.middleware.wsgi import WSGIMiddleware from fastapi.staticfiles import StaticFiles  from api import router  os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings") os.environ.setdefault("DJANGO_CONFIGURATIN", "Localdev")  application = get_wsgi_application()  app = FastAPI() app.mount("/admin", WSGIMiddleware(application)) app.mount("/static"     StaticFiles(          directory=os.path.normpath(               os.path.join(find_spec("django.contrib.admin").origin, "..", "static")          )    ),    name="static", ) 

또한 이것은 ()의 것입니다. 이것은 좀 더 간단한 예입니다.

from fastapi import FastAPI from fastapi.middleware.wsgi import WSGIMiddleware from flask import Flask, escape, request  flask_app = Flask(__name__)   @flask_app.route("/") def flask_main():     name = request.args.get("name", "World")     return f"Hello, {escape(name)} from Flask!"   app = FastAPI()   @app.get("/v2") def read_main():     return {"message": "Hello World"}   app.mount("/v1", WSGIMiddleware(flask_app)) 

멋진 답변 감사합니다. 여기 장고 앱의 모델을 사용했을 뿐만 아니라 일부 수입품을 수정한 약간 수정된 답변이 있습니다.

from fastapi import FastAPI from fastapi.middleware.wsgi import WSGIMiddleware from django.core.wsgi import get_wsgi_application import os from importlib.util import find_spec from fastapi.staticfiles import StaticFiles from django.conf import settings   # Export Django settings env variable os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')  # Get Django WSGI app django_app = get_wsgi_application()  # Import a model # And always import your models after you export settings # and you get Django WSGI app from accounts.models import Account  # Create FasatAPI instance app = FastAPI()  # Serve Django static files app.mount('/static',     StaticFiles(          directory=os.path.normpath(               os.path.join(find_spec('django.contrib.admin').origin, '..', 'static')          )    ),    name='static', )  # Define a FastAPI route @app.get('/fastapi-test') def read_main():     return {         'total_accounts': Account.objects.count(),         'is_debug': settings.DEBUG      }  # Mount Django app app.mount('/django-test', WSGIMiddleware(django_app)) 

힌트: 나는 내 장고 프로젝트의 루트 디렉터리에 이름을 가진 파일을 만들었고 그것은 작동했다. 내 디렉토리 구조는 다음과 같습니다.

. ├── accounts │   ├── __init__.py │   ├── admin.py │   ├── apps.py │   ├── migrations │   │   ├── 0001_initial.py │   │   ├── __init__.py │   ├── models.py │   ├── tests.py │   └── views.py ├── app.py ├── db.sqlite3 ├── project │   ├── __init__.py │   ├── asgi.py │   ├── settings.py │   ├── urls.py │   └── wsgi.py └── manage.py 

그리고 빠르게 달려라.API 앱:

(myvenv) ➜  project uvicorn --host 0.0.0.0 --port 8000 app:app --reload INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) INFO:     Started reloader process [48366] using statreload INFO:     Started server process [48368] INFO:     Waiting for application startup. INFO:     Application startup complete. 

이것이 당신에게 효과가 있기를 바랍니다. 이제 액세스하면 Django 프로젝트에 도움이 되고 Fast에 도움이 됩니다.API 파트.

이 구성은 Django 정적 파일도 제공하며 Fast에서 Django 모델을 사용할 수 있습니다.API 코드도 있습니다. 제가 더 테스트해보고 개선 가능성이 발견되면 이 답변을 업데이트하겠습니다.


다음과 같은 좋은 리소스가 있습니다.

FastAPI와 Django의 강력한 기능 결합


갱신하다

아래 나열된 접근 방식에서는 가능하지만, 나는 진심으로 우리가 그러한 단일체에서 서로 다른 프레임워크를 결합하는 것을 피해야 한다고 생각한다. 이렇게 하면 예상치 못한 버그가 발생하여 확장하기가 더 어려워질 수 있습니다.

대신 FastAPI에서 백엔드 서비스 1개, 예를 들어 Django Admin 서비스 1개를 구축한 다음 NGINX를 사용하여 트래픽을 이러한 백엔드 서비스로 라우팅할 수 있습니다. 이는 운영 환경에서 일반적입니다.

Fast API와 Django(WSGI)의 통합

https://github.com/jordaneremieff/django-fastapi-example.git

몇 시간 동안 검색한 끝에 위의 링크에서 훌륭한 구현을 발견했습니다. 그것은 나에게 완벽하게 작동했다!

테스트

테스트하기 쉽게 하기 위해 아래는 위의 참조에 대해 몇 가지 조정한 것입니다.

api/filename삐삐

class Item(models.Model):     title = models.CharField(max_length=50)     description = models.TextField()     # owner = models.ForeignKey(     #     settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="items"     # ) 

api/schema삐삐

class Item(ItemBase):     # id: int     # owner_id: int      class Config:         orm_mode = True 

포스트.

curl -d "{\"title\":\"le titre\", \"description\":\"la description\"}" -H "Content-Type: application/json" -X POST http://127.0.0.1:8000/api/items 

얻다

curl http://127.0.0.1:8000/api/items 

커밋에서 지적한 바와 같이: 또한 Fast API(루트, 파이던틱 모델 검증)와 같은 매우 유사한 개념을 사용하지만 단순히 장고 앱인 프로젝트도 있다.

현재 Django가 에서 비동기 뷰도 지원한다는 점을 감안할 때, 통합이 잘 안 되는 만큼 동일한 기능 세트를 훨씬 더 복잡하게 만드는 것은 의미가 없다고 본다.

반응형