如何解决可以在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 模型。我会进一步测试它,如果我发现任何改进的可能性,我会更新这个答案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。