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)
Wil*_* Le 13
虽然下面列出的方法是可能的,但我真诚地认为我们应该避免在这样一个整体中耦合不同的框架。这样做可能会导致意想不到的错误,并使扩展变得更加困难。
相反,我们可以在 FastAPI 中构建 1 个后端服务,例如 1 个 Django 管理服务,然后使用 NGINX 将流量路由到这些后端服务。无论如何,使用 NGINX 作为反向代理将流量路由到生产中的不同后端服务是很常见的。
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)
感谢您的精彩回答。这是一个稍微调整的答案,我修复了一些导入,并且使用了 Django 应用程序中的模型。
\nfrom 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))\nRun Code Online (Sandbox Code Playgroud)\napp.py提示:我在 Django 项目的根目录中创建了一个名为的文件,并且它有效。这是我的目录结构:
.\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\nRun 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.\nRun Code Online (Sandbox Code Playgroud)\n希望这对您有用。现在访问/django-test将为您的 Django 项目提供服务,并将为/fastapi-testFastAPI 部分提供服务。
此配置也提供 Django 静态文件,我们也可以在 FastAPI 代码中使用 Django 模型。我将进一步测试它,如果我发现任何改进的可能性,我将更新这个答案。
\n正如Sumitrhan在评论中指出的那样:还有一个Django Ninja项目,它使用非常相似的概念,如 Fast API(路由、Pydantic 模型验证),但只是一个 Django 应用程序。
鉴于当前版本的 Django 支持异步视图,我认为混合 django 和 FastApi 没有任何意义:只会让相同的功能集变得更加复杂并且集成得不太好。
| 归档时间: |
|
| 查看次数: |
7298 次 |
| 最近记录: |