使用数据类实现 JSON API
项目描述
这个库提供了一个装饰器,当应用于 Django 视图时,它会执行 JSON 序列化并使用dataclasses-jsonschema库强制执行模式。
它还使您能够将 API 定义导出到OpenAPI规范文件。这使您能够自动生成客户端库。
用法
要使用它,请使用django-dataclasses提供的适当 HTTP 方法 (post、get、patch或put)装饰您的视图函数。使用适当的数据类类型注释函数的返回值。
接受输入的视图需要一个带有适当数据类类型注释的附加主体参数:
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 钩子使用black、flake8和isort进行Python 自动格式化
使用PBR的自动版本控制和变更日志
使用 PBR 进行版本控制
当您通过合并拉取请求提交到主分支时, PBR库将自动增加版本。合并时您在 GitHub 上输入的提交消息将使用Semantic Versioning确定分配的版本号。
以Sem-Ver:开头的消息:错误修复,或没有匹配消息的消息将碰撞PATCH编号
以Sem-Ver: feature或Sem-Ver: deprecation开头的消息会影响 MINOR编号。
以Sem-Ver: api-break开头的消息会影响MAJOR编号。
项目详情
django_dataclasses -0.2.2-py3-none-any.whl 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 9ef6ae57706f6ace95ac7262f706f69aa59b67199913cf10167522d85423acfb |
|
| MD5 | f5edf94a2127d0fe8fb04fa6212ca1b3 |
|
| 布莱克2-256 | 8807dd6d8a2a7e49385a6e1e3d5195770acc213120855fb5b1539570666eb925 |