Django Ninja快速入门,一个类似于FastAPI的异步开发框架,和Django无缝集成

1,392 阅读3分钟

概述

Django Ninja 是一个网络框架,用于使用 Django 和 Python 3.6+ 类型的提示构建应用程序接口。

主要功能

  • 简单:设计为易于使用且直观。
  • 快速执行:得益于 Pydantic 和异步支持,性能非常高。
  • 快速编码:类型提示和自动文档让您只需专注于业务逻辑。
  • 基于标准:基于 API 开放标准:OpenAPI(以前称为 Swagger)和 JSON 模式。
  • Django 友好:(显然)与 Django 核心和 ORM 集成良好。
  • 生产就绪:多家公司在实际项目中使用(如果您使用 django-ninja 并希望发布反馈,请发送电子邮件至 ppr.vitaly@gmail.com)。

性能对比图

背后故事

事实上,Django Ninja 在很大程度上受到了 FastAPI(由 Sebastián Ramírez 开发)的启发。 尽管如此,要让 FastAPI 和 Django 正常协同工作,还存在一些问题:

  • FastAPI 声明与 ORM 无关(这意味着您可以将其与 SQLAlchemy 或 Django ORM 一起使用),但实际上 Django ORM 还没有准备好用于异步使用(可能在 4.0 或 4.1 版),如果您在同步模式下使用它,可能会出现关闭连接的问题,您必须花费大量精力来解决这个问题。
  • 如果在操作中依赖于身份验证和数据库会话(对某些项目而言,99% 的操作都依赖于身份验证和数据库会话),带有参数的依赖注入会使代码过于冗长。
  • 由于模型一词在 Django 中是 "保留 "给 ORM 使用的,因此当您将 Django ORM 与 Pydantic/FastAPI 模型命名约定混合使用时,就会变得非常混乱。

Django Ninja 解决了所有这些问题,并很好地与 Django 集成(ORM、urls、views、auth 等)。在 Django 网页设计开发工作室 Code-on 工作时,我遇到了各种各样的挑战,为了解决这些问题,我在 2020 年启动了 Django-Ninja。Django-Ninja 是一个生产准备就绪的项目--据我估计,目前已有 100 多家公司在生产中使用它,每月有 500 名新开发人员加入。一些公司已经在寻找具有 Django Ninja 经验的开发人员。

主要功能:

  • 由于可以拥有多个 Django Ninja API 实例,因此可以在一个 Django 项目中运行多个 API 版本。
  • Django Ninja 的 "Schema "类与 ORM 集成,因此可以序列化查询集或 ORM 对象。
  • 从 Django 模型创建Schema。
  • Django Ninja 使用请求实例属性(与普通 Django 视图的方式相同)来代替依赖参数,更多详情请查看身份验证。

相关文档

入门案例

创建项目:

pip install django
django-admin startproject ninjademo

创建虚拟环境并安装依赖:

cd ninjademo
python -m venv venv
.\venv\Scripts\activate
pip install django
pip install django-ninja

修改urls.py,引入ninja并创建路由:

from django.contrib import admin
from django.urls import path

# 导入ninja
from ninja import NinjaAPI

# 创建api
api = NinjaAPI()


# 创建路由
@api.get("/add")
def add(request, a: int, b: int):
    return {"result": a + b}


urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", api.urls),
]

启动服务:

python manage.py runserver

浏览器访问

抽离接口代码

创建api.py,编写接口代码:


from ninja import NinjaAPI

api = NinjaAPI()


@api.get("/hello")
def hello(request):
    return "Hello world"

修改urls.py,引入api并挂载api:
from django.contrib import admin
from django.urls import path
from .api import api

urlpatterns = [
    path("admin/", admin.site.urls),
    path("api/", api.urls),
]

启动服务,浏览器访问:http://127.0.0.1:8000/api/hello

文末福利,免费送电子书

C++ Primer Plus:中文版(第六版) (Stephen Prata) (Z-Library).pdf

免费下载地址: url22.ctfile.com/f/38921122-… 访问密码: 3553

本文使用 markdown.com.cn 排版