可以在Django中使用FastAPI吗?

问题描述

我是Django开发人员,最近偶然发现了FastAPI框架。

然后我决定试一试。但是通常在谈论使用Django构建RESTful API时,通常会使用Django Rest Framework(DRF)。

是否有人知道可以使用Django特权(如其ORM)用FastAPI替代DRF,并且仍然可以访问FastAPI的所有<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/gh/garand/sticky@master/jquery.sticky.js"></script> <div class="main" style="width:100%; position:absolute;"> <div class="fixed" id="fixed" style="height: 80px; "> <button class="cart-btn"> IN DEN WARENKORB LEGEN</button> </div> </div>功能吗?

到目前为止,我只发现了一篇关于此的文章。但是在集成过程中,作者失去了FastAPI的大部分功能You can find it here

在Fastapi文档中,他们确实提到可以将某些请求重定向到Wsgi应用程序here

解决方法

简短答案

是的, WSGIMiddleware 可能

例如,您可以使用此示例代码在安装时使用所有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",)

这也是来自WSGIMiddleware文档,这是一个更简单的示例(这是针对Flask的,但它演示了相同的想法。)。

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))
,

感谢您的精彩回答。这是一个稍微调整的答案,其中我修复了一些导入以及我使用了来自 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))

提示:我在我的 Django 项目的根目录中创建了一个名为 app.py 的文件并且它工作正常。这是我的目录结构:

.
├── 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

并运行您的 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.

希望这对你有用。现在访问 /django-test 将为您的 Django 项目提供服务,而 /fastapi-test 将为 FastAPI 部分提供服务。

此配置也提供 Django 静态文件,我们也可以在 FastAPI 代码中使用我们的 Django 模型。我会进一步测试它,如果我发现任何改进的可能性,我会更新这个答案。