Skip to main content

使用数据类实现 JSON API

项目描述

这个库提供了一个装饰器,当应用于 Django 视图时,它会执行 JSON 序列化并使用dataclasses-jsonschema库强制执行模式。

它还使您能够将 API 定义导出到OpenAPI规范文件。这使您能够自动生成客户端库。

用法

要使用它,请使用django-dataclasses提供的适当 HTTP 方法 (postgetpatchput)装饰您的视图函数。使用适当的数据类类型注释函数的返回值。

接受输入的视图需要一个带有适当数据类类型注释的附加主体参数:

from django import http
import django_dataclasses


@django_dataclasses.dataclass
class StringLengthRequest:
    input: str


@django_dataclasses.dataclass
class StringLengthResponse:
    length: int


@django_dataclasses.login_required
@django_dataclasses.post
def string_length(request: http.HttpRequest, body: StringLengthRequest) -> StringLengthResponse:
    """Calculate the length of a string"""
    return StringLengthResponse(length=len(body.input))

返回错误

要在视图中返回错误响应,请引发django_dataclasses.ErrorResponse。例如,在这种情况下,如果登录凭据无效,我们会引发ErrorResponse :

if user is not None:
    login(request, user)
    return UserResponse(user.username)
else:
    raise django_dataclasses.ErrorResponse("Incorrect username or password", 401)

异常将被django-dataclasses装饰器捕获 ,并返回带有文本正文和您提供的状态代码的 HTTP 响应。

查询参数

使用查询参数的视图需要一个额外的查询参数,并带有适当的数据类作为类型注释:

from django import http
import django_dataclasses


@django_dataclasses.dataclass
class QueryParams:
    contains: str = ""


@django_dataclasses.dataclass
class FruitsResponse:
    """Fruits with the given string"""
    fruits: typing.List[str]


@django_dataclasses.get
def fruit_medley(request: http.HttpRequest, query: QueryParams) -> FruitsResponse:
    """Fruits that contain a given string"""
    fruits = ["apple", "pear", "orange", "plum"]
    return FruitsResponse([fruit for fruit in fruits if query.contains in fruit])

可迭代和分页结果

django-dataclasses包括iterable_factory实用程序,用于创建表示可迭代结果列表的数据类,从而减轻了为基于列表的端点重新定义相同模式的需要。

例如,如果要返回以下结果的列表:

@django_dataclasses.dataclass
class MyObject:
    val: int

使用iterable_factory创建一个可迭代项的包装器。例如:

MyIterableObject = django_dataclasses.iterable_factory(MyObject)


@django_dataclasses.post
def iterable_get(request: http.HttpRequest) -> MyIterableObject:
    """Return an iterable of results"""
    return MyIterableObject(items=[MyObject(val=0), MyObject(val=1)])

返回的有效负载将包含一个带有序列化结果的项目键。

有效负载还包括分页属性,包括返回的项目总数当前页码。默认情况下,不会发生分页。要启用分页,请将 paginated=True传递给iterable_factory,如下所示:

@django_dataclasses.dataclass
class QueryParams:
    """All query params must be strings as they are encoded in the URL"""
    page: str = "1"
    page_size: str = "10"


MyPaginatedObject = django_dataclasses.iterable_factory(MyObject, paginated=True)


@django_dataclasses.get
def paginated_get(request: http.HttpRequest, query: QueryParams) -> MyPaginatedObject:
    """Return an paginated iterable of results"""
    page = MyPaginatedObject(
        items=models.MyModel.objects.all(),
        page_num=int(query.page),
        page_size=int(query.page_size)
    )
    page.items = [IterableObject(row.a) for row in page.items]
    return page

默认情况下,页面大小为 10。这可以通过将page_size传递给分页器来更改。页面大小为2的示例响应负载将如下所示:

{
    'page': 1,
    'count': 20,
    'items': [
        {'val': 0},
        {'val': 1}
    ]
}

架构导出

这个库的灵感来自于使用自动生成的 gRPC 客户端库的便利性。不是每个人都可以采用 gRPC,django- dataclasses旨在为 JSON API 提供类似的工具包。

使用此管理命令以 OpenAPI 格式导出您的模式。您需要将 django_dataclasses添加到INSTALLED_APPS以使其可用:

./manage.py openapi_export > api.json

然后,使用另一个库自动生成客户端库。例如,您可以使用 openapi-typescript-codegen通过运行以下命令生成带有类型化方法的 JavaScript 客户端:

yarn add --dev openapi-typescript-codegen
yarn run openapi --input api.json --output api/

执照

贡献是根据 Apache 许可证 2.0 版的条款进行的。请参阅许可证

贡献

本项目使用pyenv,请先安装。在 Mac 上运行时,Makefile使用 Homebrew 安装依赖项。在其他平台上,请手动安装它们。

通过运行以下命令克隆存储库并设置您的开发环境:

git clone https://gitlab.com/roivant/oss/django-dataclasses.git
make setup

运行测试和代码验证:

make test
make validate

您可以通过运行此命令,使用openapi-typescript- codegen 测试导出 openapi 模式并将其编译为 JavaScript 。输出文件放在文件夹api/中:

make api

贡献者必须遵守贡献者契约行为准则。请向vant报告涉嫌违规行为技术英@roivant _ com

关于模板

这个存储库是从Temple-python 模板创建的。如果您有权访问该存储库,请通过运行以下命令应用模板中的更新:

temple update

包括哪些工具?

  • 为方便起见的 Makefile;使用make setup设置您的开发环境

  • .gitlab-ci.yml中的构建配置

  • 一个使用 pytest 并且需要 100% 覆盖率的测试框架;使用make test运行

  • 通过 git pre-commit 钩子使用blackflake8isort进行Python 自动格式化

  • 使用PBR的自动版本控制和变更日志

使用 PBR 进行版本控制

当您通过合并拉取请求提交到主分支时, PBR库将自动增加版本。合并时您在 GitHub 上输入的提交消息将使用Semantic Versioning确定分配的版本号。

  • 以Sem-Ver:开头的消息:错误修复,或没有匹配消息的消息将碰撞PATCH编号

  • 以Sem-Ver: featureSem-Ver: deprecation开头的消息会影响 MINOR编号。

  • 以Sem-Ver: api-break开头的消息会影响MAJOR编号。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

内置分布

django_dataclasses-0.2.2-py3-none-any.whl (18.0 kB 查看哈希)

已上传 py3