Soy un desarrollador de Django y recientemente me topé con el marco FastAPI.
Entonces decidí darle una oportunidad. Pero, por lo general, cuando habla sobre la creación de API RESTful con Django, generalmente usa Django Rest Framework (DRF).
¿Alguien sabe si es posible sustituir DRF por FastAPI usando las ventajas de Django, como su ORM, y aún tener acceso a todas las funciones async de FastAPI?
Hasta ahora solo encontré un artículo sobre esto. Pero en el proceso de integración, el autor perdió la mayoría de las características de FastAPI. Puedes encontrarlo aquí .
En los documentos de FastAPI, mencionan que es posible redirigir ciertas solicitudes a una aplicación WSGI aquí .
Sí, es posible con WSGIMiddleware .
Por ejemplo, puede usar todas las funciones de Django (sí, administrador también) con el montaje, con este código de ejemplo.
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", )También este es de la documentación de WSGIMiddleware , es un ejemplo más directo ( Este es para Flask pero demuestra la misma idea ).
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))Gracias por las increíbles respuestas. Aquí hay una pequeña respuesta modificada donde arreglé algunas importaciones y usé un modelo de una aplicación Django.
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)) Sugerencia: creé un archivo llamado app.py en el directorio raíz de mi proyecto Django y funcionó. Aquí está mi estructura de directorios:
. ├── 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.pyY ejecute su aplicación FastAPI:
(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. Se espera que esto funcione para usted. Ahora acceder a /django-test servirá a su proyecto Django y /fastapi-test servirá a la parte FastAPI.
Esta configuración también sirve archivos estáticos de Django y también podemos usar nuestros modelos de Django en nuestro código FastAPI. Lo probaré más y actualizaré esta respuesta si encuentro alguna posibilidad de mejora.
hay un buen recurso de la siguiente manera: