资源管理器

资源管理器,起着连接器的作用,它连接着数据抽象层、数据层以及其他可选的功能。其内部可以管理资源的各项逻辑。

Flask-REST-JSONAPI提供了三种资源管理器,实现了JSONAPI 1.0规范的默认方法。

  • ResourceList:提供GET和POST方法,分别用于读取资源列表和创建资源。
  • ResourceDetail:提供GET、PATCH和DELETE方法,分别用于读取资源详情、更新资源以及删除资源。
  • ResourceRelationship:提供GET、POST、PATCH和DELETE方法,对关系进行增删改查。

我们能重写任意的默认方法,来定制功能。整个资源管理器是保持解耦的,我们可以在不配置其他属性的情况下,对所有方法重写、对某个方法重写,亦或禁用某个方法。

必选属性


如果我们想使用资源管理器的默认方法实现,我们必须设置两个属性:schema和data_layer。

  • schema: 逻辑数据抽象层,它必须继承自marshmallow_jsonapi.schema.Schema。
  • data_layer: 这个属性用于初始化你的数据层。如果想了解更多,请查看数据层文档。

例:

from flask_rest_jsonapi import ResourceList
from your_project.schemas import PersonSchema
from your_project.models import Person
from your_project.extensions import db

class PersonList(ResourceList):
    schema = PersonSchema
    data_layer = {'session': db.session,
                  'model': Person}

可选属性


所有的资源管理器都继承自flask.views.MethodView,所以我们能在资源管理器中,使用Flask的可选属性。

  • methods: 资源管理器可用的HTTP方法,如果没指定,那么所有方法都可用。
  • decorators: 针对所有方法的装饰器元组。

另外,我们还能给资源管理器的每个HTTP方法,设定不同schema的参数:

  • get_schema_kwargs: GET方法的schema默认字典参数
  • post_schema_kwargs: POST方法的schema默认字典参数
  • patch_schema_kwargs: PATCH方法的schema默认字典参数
  • delete_schema_kwargs: DELETE方法的schema默认字典参数

同时,每个方法,都有一对前置和后置处理方法。前置处理方法,会将view args和kwarg作为参数;后置处理方法,会将返回的结果作为参数。正是有了这对方法,我们才能对前置和后置做定制化的处理。可以重写的方法如下:

  • before_get: GET的前置处理方法
  • after_get: GET的后置处理方法
  • before_post: POST的前置处理方法
  • after_post: POST的后置处理方法
  • before_patch: PATCH的前置处理方法
  • after_patch: PATCH的后置处理方法
  • before_delete: DELETE的前置处理方法
  • after_delete: DELETE的后置处理方法

ResourceList 资源列表


ResourceList 管理器有它特有的可选参数:

  • view_kwargs: 如果你设置了这个参数为True,那么读取列表url时,就会读取view kwargs的值。如果我们配置了如下路由:/persons/int:id/computers,那么这个值则必须为True。

例:

from flask_rest_jsonapi import ResourceList
from your_project.schemas import PersonSchema
from your_project.models import Person
from your_project.extensions import db

class PersonList(ResourceList):
    schema = PersonSchema
    data_layer = {'session': db.session,
                  'model': Person}

以上为最小的ResourceList实现。它提供了GET和POST方法,用于读取对象集合以及创建对象,同时,它实现了分页、排序、稀疏字段、过滤以及包含关联字段的特性。

如果我们的schema包含关系字段,我们也能够创建对象时,同时创建关联对象。具体例子,请查看快速上手章节。

ResourceDetail 资源详情


例:

from flask_rest_jsonapi import ResourceDetail
from your_project.schemas import PersonSchema
from your_project.models import Person
from your_project.extensions import db

class PersonDetail(ResourceDetail):
    schema = PersonSchema
    data_layer = {'session': db.session,
                  'model': Person}

以上为最小的ResourceDetail实现。它提供了GET,PATCH和DELETE方法,用于读取对象详情、更新对象以及删除对象,同时,它实现了所有强大的特性,如稀疏字段和包含关联字段的特性等。

如果我们的schema包含关系字段,我们也能够更新对象时,同时更新关联对象。具体例子,请查看快速上手章节。

ResourceRelationship 资源关系


例:

from flask_rest_jsonapi import ResourceRelationship
from your_project.schemas import PersonSchema
from your_project.models import Person
from your_project.extensions import db

class PersonRelationship(ResourceRelationship):
    schema = PersonSchema
    data_layer = {'session': db.session,
                  'model': Person}

以上为最小的ResourceRelationship实现。它提供了GET,POST,PATCH和DELETE方法,用于读取、创建关系、更新关系以及删除关系,同时,它实现了所有强大的特性,如稀疏字段和包含关联字段的特性等。