Django Ninja

Django Ninja 教程

搭建项目

  • 安装

    pip3 install django-ninja
  • 创建django项目

    django-admin startproject myproject
  • 单应用项目

    • 创建api.py,与 url.py 同级

    from ninja import NinjaAPI
    
    api = NinjaAPI()
    
    @api.get('/hello')
    def hello(request):
       return {'hello': 'world'}
    • 在url.py配置url路由

    from django.contrib import admin
    from django.urls import path
    from .api import api
    
    urlpatterns = [
       path('admin/', admin.site.urls),
       path('api/', api.urls),
    ]
  • 请求方法选择

请求方法选择。如果一个方法一个处理函数,直接使用@api.get(path)

如果是多个方法一个处理函数,则使用@api.api_operation(method, path)

其中,method用列表表示。

路由器

多应用路由

  • 当有多个应用时,在每个应用中的创建一个api.py模块(或者直接在views.py模块)中写各自的路由.

  • 在项目文件夹urls.py中实现多个应用的router注册

路由器认证

路由器标签

  • 可以使用tags参数将标签应用于路由器声明的操作。

路由器嵌套

请求数据

路径参数

  • 所有的路径参数都会按照给定的类型自动转化,如果转化失败,则报错。

  • 常规python格式化字符串形式

路径参数转换器

使用Schema路径转换

请求参数

请求参数分为两种:位置参数和可选参数。

位置参数

  • 不给定参数类型,则默认为字符串类型。

可选参数

  • 通过给定参数默认值实现。

位置参数和可选参数综合使用

使用Schema定义

注:Query()函数用来标记filters参数是查询参数。

请求体

使用Schema

注意:如果使用None作为默认值,则该参数可传可不传。

路径参数、查询参数和请求体

  • 三者同时出现时,解析如下:

    • 如果参数在路径中申请,则该参数为路径参数;

    • 如果参数类型申明使用单数类型(例如 int, float, str, bool等),则该参数为请求参数;

    • 如果参数类型申明使用Schema,则该参数为请求体。

Form表单

Form数据作为参数

使用Schema

路径参数,请求参数和表单

将空表单值设置为默认值

文件上传

单个文件上传

多个文件上传

  • 上传的文件属性和方法和django中相同,主要包括以下:

    • read() 从文件中读取整个上传的文件。文件太大会报错。

    • multiple_chunks(chunk_size=None) 如果上传的文件足够大,需要分块读取,返回True。默认情况下是大于2.5M的文件。

    • chunks(chunk_size=None) 一个生成器,返回文件的块。

    • name 上传文件的文件名

    • size 上传文件的大小,以字节为单位

    • content_type 与文件一起上传的内容类型头

    • content_type_extra 包含传递给content-type头的额外参数的字典。

    • charset 对于text/*内容类型,浏览器提供的字符集。

响应体Schema

一般在应用中创建一个schema.py存储。 请求相关Schema(参考请求数据) 响应体Schema

返回体为简单对象

返回体为嵌套对象

返回文件对象或图片

  • 文件或图片的schema均返回地址。

返回状态码和数据

当返回状态码和数据一致时,可使用4xx

自我套用

Model的Schema

选择包含字段

选择不包含字段

覆盖字段(修改某些字段注释或者添加新字段)

其他,使用create_schema

  • 语法

使用model参数

注: 如未定义 schema, 仅仅使用model参数会将所有的User信息返回,容易暴露敏感数据。

  • 使用fields参数

  • 使用exclude参数

  • 使用depth参数

  • 自定义schema

参考官方文档: https://django-ninja.rest-framework.com/tutorial/config-pydantic/

认证

一般建议把认证相关可调用对象放在util包中。

使用自带认证

  • 方法一、使用django验证

访问"/pets"路由时,会使用Django会话身份验证(默认是基于cookie),验证通过调用对应视图函数,否则返回HTTP-401错误。

  • 方法二、全局认证

在全局认证时,如果某些函数不需要全局认证,则将该路由路径中的auth设置为None。

  • 方法三、路由器认证

使用自定义认证

  • 自定义功能

"auth="参数接受任何Callable对象。仅当可调用对象返回可转化为布尔值True的值时,NinjaAPI才通过身份验证。此返回值将分配给属性request.auth。

方法一、请求URL参数中带有api_key验证信息

方法二、请求Header头中带有X-API-KEY验证信息

方法三、Cookie中带有验证

方法四、HTTP JWT 验证

方法五、HTTP基本身份验证

方法六、多个验证器

改变出现错误时返回值(自定义异常)

操作参数

标签

  • OpenAPI上分组依据,默认按router分组。

  • 使用tags参数(list[str])对API操作进行分组

路由器标签

操作:摘要

  • OpenAPI上操作的可读名称,默认为视图函数名称大写生成。

使用summary参数进行修改。

操作:说明

  • OpenAPI上显示操作的的说明信息。

注:当需要提供很长的多行描述时,可以使用 Pythondocstrings进行函数定义:

OpenAPI操作ID

OpenAPIoperationId是一个可选的唯一字符串,用于标识操作。如果提供,这些 ID 在您的 API 中描述的所有操作中必须是唯一的。

默认情况下,Django Ninja将其设置为module name+ function name。

  • 每个操作单独设置。

  • 覆盖全局行为。

操作:已弃用

将操作标记为已弃用。使用deprecated参数。

输出响应选项

  • by_alias:使用应将字段别名用作响应中的键(默认为False)。

  • excluede_unset:是否应将从响应中排除在创建构架时未设置且具有默认值的字段(默认为False)。

  • exclude_defaults:是否应从响应中排除等于其默认值(无论是否设置)的字段(默认为False)。

  • exclude_none:是否从响应中排除等于None的字段(默认为False)

从架构中包含/排除操作(文档)

网址名称

  • 允许设置api端点url名称(使用django路径命名)。**

版本控制

使用Django Ninja,可以轻松地从单个 Django 项目运行多个 API 版本。

不同的API版本号

不同的业务逻辑

请求解析器

在大多数情况下,REST API 的默认内容类型是 JSON,但如果您需要使用其他内容类型(如 YAML、XML、CSV)或使用更快的 JSON 解析器,Django Ninja提供了parser配置。

YAML解析器

ORJSON 解析器

响应渲染器

REST API 最常见的响应类型通常是JSON。Django Ninja还支持自定义渲染器,这可以让您灵活地设计自己的媒体类型

创建渲染器

  • render函数参数如下:

    • request: HttpRequest对象

    • data:需要序列化的对象

    • response_status(int):将返回给客户端的HTTP状态码

ORJSON 渲染实例

orjson 是一个快速、准确的 Python JSON 库。它作为 JSON 最快的 Python库进行基准测试,并且比标准json库或其他第三方库更准确。它还本机序列化数据类、日期时间、numpy 和 UUID 实例。

XML渲染实例

将所有响应输出为XML的渲染器。

错误处理

自定义异常处理

  • 定义一些异常(或使用现有的)

  • 使用 api.exception_handler 装饰器

  • 异常处理函数有两个参数:

    • 请求:Django http请求

    • exc: 实际异常

    • 函数必须返回http响应

覆盖默认异常处理程序

默认初始化异常

  • ninja.errors.ValidationError: 当请求数据未验证时引发

  • ninja.errors.HttpError:用于从代码的任何位置抛出带有状态代码的http错误

  • django.http.Http404:Django的默认404异常

  • Exception: 应用程序的任何其他未处理的异常

覆盖默认处理程序

抛出异常的HTTP响应

CSRF

默认情况下,Django Ninja对所有操作都关闭了CSRF 。要打开它,您需要使用csrfNinjaAPI 类的参数:

异步支持

从3.1开始,Django开始支持异步视图。

  • 异步视图在以下方面更有效的工作:

  • 通过网络调用外部API;

  • 执行/等待数据库查询;

  • 从/向磁盘驱动器读取/写入

  • 快速示例

注意:要运行此代码,必须使用Uvicorn或Daphne这样的ASGI服务器。

  • 使用Uvicorn

混合同步和异步操作

项目中可以同时使用同步和异步操作,Django Ninja会指自动路由。

弹性搜索示例

使用ORM

目前,(2020 年 7 月)Django 的某些关键部分无法在异步环境中安全运行,因为它们具有无法感知协程的全局状态。Django 的这些部分被归类为“async-unsafe”,并且在异步环境中不会被执行。ORM是主要示例,但还有其他部分也以这种方式受到保护。

如果直接用异步操作ORM,则会报错。

使用装饰器,将同步转化为异步

不使用装饰器

不会理解执行

会立即执行

Last updated