FastAPI+Django构建全栈性能怪兽

Django 的自动生成管理配置页面以及方便的ORM,让开发管理极其简单,但是默认使用同步阻塞模型导致性能一直是他的短板。
FastApi 基于 asyncioanyio,通过‌事件循环 ‌和‌非阻塞 I/O‌ 可实现高并发。

本篇将他们凑在一起,在开发Web服务时,既可以用快速API又可以有后台配置页面以及方便的ORM。

怎么配

在Django默认工程的asgi.py文件下编写如下代码,将Django挂载在FastApi中,可以使用同一个端口启动两套服务。

python 复制代码
from fastapi import FastAPI
import os
from django.core.asgi import get_asgi_application  
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware
from api_manager.docs import router as docs_router

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'iot_admin.settings')
django_app = get_asgi_application()
from api_manager.api import router as api_router  # 这里写在这里的原因是 ap使用了django的ORM

app = FastAPI(title="xxxx", docs_url=None, redoc_url=None)

app.include_router(docs_router)
app.include_router(api_router)

app.mount("/admin", django_app)  # django 的路由
app.mount("/static", StaticFiles(directory="staticfiles"), name="static")   # django html资源使用
app.mount("/", StaticFiles(directory="staticfiles", html=True), name="static")  # 可以挂载自己写的文件或者页面

关键技术点在asgi,支持的工具也有很多Uvicorn、Hypercorn、Daphne,在这里我们选择使用Daphne,具体选择看你习惯。

跑起来

js 复制代码
daphne -p 8000 xxxx.asgi:app

效果如下:

FastApi根目录接口

FastAPi api页面

Django 管理页面

后台管理模板使用了unfold

怎么在FastApi中使用Django ORM

得需要将Django的部分接口改装为异步接口,需要使用sync_to_async方法转换,具体使用方式,请自行查找。

python 复制代码
from asgiref.sync import sync_to_async
from user_manager.models import UserGuide
user_guides = await sync_to_async(
            lambda: list(UserGuide.objects.filter(user=user).select_related('guide'))
        )()

注:Django有一些方法是带异步的,例如 aget等,只是Django自己封装的sync_to_async异步方法而已,使用时,自己写sync_to_async即可

python 复制代码
async def aget(self, *args, **kwargs):
    return await sync_to_async(self.get)(*args, **kwargs)

使用Django的ORM性能会不会差很多?

一般数据量差别不大,并且开发更简单,但明显与其他语言性能差异还是比较明显,高要求就换个语言开发吧。

相关推荐
烂蜻蜓8 分钟前
Flask入门教程(十二):表单处理——从基础到Flask-WTF完整实践
后端·python·flask
2601_962055977 小时前
跟据spring boot版本,查看对应的tomcat,并查看可支持的tomcat的版本范围
spring boot·后端·tomcat
Lost of 程序猿8 小时前
ASP.NET Core API 幂等性设计深度实战:从一次重复申领事故说起
后端·asp.net
QQ_216962909610 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
郑州光合科技余经理11 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
IT_陈寒11 小时前
Vue的嵌套组件竟然吃掉了我的事件?
前端·人工智能·后端
大辉狼_音频架构12 小时前
进阶:从源码编译 SOF 固件与 topology
后端
大辉狼_音频架构12 小时前
上板:让 SOF 在 FRDM-i.MX8MP 上跑起来
后端
大辉狼_音频架构13 小时前
FRDM-IMX8MP UUU 烧录 eMMC 指南
后端
运行时异常13 小时前
【WMS 仓储系统集成 AI Agent 实战】第 3 讲:Spring Security 6 + JWT——addFilterBefore 一词之差,全站 401
java·后端