是否可以将 FastAPI 与 Django 一起使用?

Leo*_*iro 21 api django django-rest-framework fastapi

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

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

有人知道是否可以使用 Django 特权(例如 ORM)用 FastAPI 替换 DRF,并且仍然可以访问 FastAPI 的所有async功能?

到目前为止,我只找到了一篇关于此的文章。但是在集成的过程中作者失去了FastAPI的大部分功能。 你可以在这里找到它

在 FastAPI 文档中,他们确实提到可以在此处将某些请求重定向到 WSGI 应用程序。

Yag*_*nci 23

简答

是的,可以使用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",
)
Run Code Online (Sandbox Code Playgroud)

这个也来自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))
Run Code Online (Sandbox Code Playgroud)

  • @LeonardoGuerreiro 是的。另外这个[repo](https://github.com/jordaneremieff/django-fastapi-example)可能对你有用 (4认同)

Wil*_* Le 13

最新更新

虽然下面列出的方法是可能的,但我真诚地认为我们应该避免在这样一个整体中耦合不同的框架。这样做可能会导致意想不到的错误,并使扩展变得更加困难。

相反,我们可以在 FastAPI 中构建 1 个后端服务,例如 1 个 Django 管理服务,然后使用 NGINX 将流量路由到这些后端服务。无论如何,使用 NGINX 作为反向代理将流量路由到生产中的不同后端服务是很常见的。

FastAPI 与 Django 的集成 (WSGI)

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

经过几个小时的搜索,我终于在上面的链接中找到了一个很好的实现。它对我来说无缝工作!

测试

为了使测试变得简单,以下是我对上述参考资料所做的一些调整:

api/models.py

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"
    # )
Run Code Online (Sandbox Code Playgroud)

api/schemas.py

class Item(ItemBase):
    # id: int
    # owner_id: int

    class Config:
        orm_mode = True
Run Code Online (Sandbox Code Playgroud)

邮政

curl -d "{\"title\":\"le titre\", \"description\":\"la description\"}" -H "Content-Type: application/json" -X POST http://127.0.0.1:8000/api/items
Run Code Online (Sandbox Code Playgroud)

得到

curl http://127.0.0.1:8000/api/items
Run Code Online (Sandbox Code Playgroud)


Reh*_*mat 8

感谢您的精彩回答。这是一个稍微调整的答案,我修复了一些导入,并且使用了 Django 应用程序中的模型。

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

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

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 accounts\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 admin.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apps.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 0001_initial.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 views.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 app.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db.sqlite3\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 project\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 asgi.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 settings.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 urls.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wsgi.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 manage.py\n
Run Code Online (Sandbox Code Playgroud)\n

并运行您的 FastAPI 应用程序:

\n
(myvenv) \xe2\x9e\x9c  project uvicorn --host 0.0.0.0 --port 8000 app:app --reload\nINFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)\nINFO:     Started reloader process [48366] using statreload\nINFO:     Started server process [48368]\nINFO:     Waiting for application startup.\nINFO:     Application startup complete.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n


Kou*_*und 7

正如Sumitrhan在评论中指出的那样:还有一个Django Ninja项目,它使用非常相似的概念,如 Fast API(路由、Pydantic 模型验证),但只是一个 Django 应用程序。

鉴于当前版本的 Django 支持异步视图,我认为混合 django 和 FastApi 没有任何意义:只会让相同的功能集变得更加复杂并且集成得不太好。

  • 该问题要求“可以用 FastAPI 替代 DRF”,同时**仍然可以访问 FastAPI 的所有异步功能**。这就是我的答案实际上的答案。作者想在django中使用FastAPI功能。这就是 Ninja 提供的。 (2认同)