云函数
常规的数据读写接口,建议通过配置API的方式提供,云函数一种用于为配置API无法满足的需求编写接口的方式。
按照云函数的使用场景划分,可分为三类:
- object 函数,即针对某条数据的操作接口,如为一个商品生成小程序码。
- model 函数,即为某个model提供的扩展接口,如收取订单,同步用户等操作。
- 批量操作 函数,用于列表中选中的多条数据进行处理的场景。
以上三种函数的编写方式几乎一致,区别仅在于他们接受的参数略有差异。
#
定义云函数首先,在应用根目录下创建functions.py文件,用于编写云函数,写在这个文件下的云函数将会被lightning自动发现。
下面的过程与代码,均发生在应用根目录下functions.py文件里面。
#
导入lightning_func装饰器#
编写云函数以下演示三种云函数的定法,它们的区别主要是函数接受的参数不同:
#
编写objectobject函数,有一个id参数需要提供:
#
编写Modle函数model函数无额外的参数需要提供:
#
编写批量操作函数批量操作函数需要一个ids(id列表)参数:
以上演示了云函数的编写方式,里面有三个关键点需要掌握:
1. lightning_func 装饰器的使用。
lightning_func 装饰器用于向lightning注册云函数,它接收以下几个参数:
name: 必填,云函数名,英文、数字、下划线的组合。在一个model下,必需唯一。
model: 指定模型,必填,lightning会把该函数挂载某个model下。
login_required:是否要求登录才能调用。默认是True。
staff_required:是否要求员工(后台管理员)才能调用,默认是False。
superuser_required:是否要求超级管理员才能调用,默认是False。
permissions: 所需权限。前三个xxx_required是常见的权限,更多个性化的控限控制可在此定义。该参数接受一个数组,数组元素为字符串或一个权限类:
字符串:即django的auth应用中 Permission 模型的code,可指定有某个Permission的用户才能调用该函数。
权限类:继承于lightning.BasePermission的权限类。该类需要实现以下方法:
has_permission(self, user, model, func_name, params, request)
方法返回True代表有权限,False代表无权限。
2. 云函数的参数
云函数要求的参数有:
- user, 必须,代表当前用户。
- id, 可选,当编写Object函数时,才需要提供该参数。
- ids, 可选,当编写批量操作函数时,才需要提供该参数。
- **kwargs,必须。lightning需要注入一些额外的参数,如:
- view_context,请求上下文,通过该上下文可以获得request, view等的访问权限。
- 其他,介于user与 **args之间的参数,用户根据需求进行自定义即可,这些参数的值类型应该是可序列化为JSON的类型,包括Python的几种内置数据类型。
3. 云函数返回值
云函数可以返回以下格式:
- Python内置数据格式,如str, int, float, bool, datetime,list, dict等,简言之,能够被json.dumps处理的返回值均可。
- Django Model实例,返回的实例必须是当前云函数装饰器中同样的Model,否则会出错。
- Django QuerySet,返回的QuerySet必须是当前云函数装饰器中同样的Model,否则会出错。
- django.http.HttpResponse实例。
- django_restframework.response.Reponse实例。
- 无返回值。
以下是完整的示例:
#
使用云函数云函数有两种使用方式:
- 作为接口调用,云函数的本质是一个接口,所以,可以当作接口来调用。
- 在管理界面上,作为单行数据的操作项或模型的全局操作使用。
#
1. 作为接口路径:云函数使用统一规格的请求路径: /basebone/{app_label}__{model_name}/func/
,其中app_label
与model_name
因不同的Model而异,两者之间是双下划线。
方法:POST
请求体:为JSON object,即Content-Type为 application/json
,有两个参数:
- func_name: 云函数名,即使用lightning_func注册时指定的name。
- params: JSON object, 里面的属性即对应云函数的参数(user与**kwargs之间的参数)。
返回结果:为JSON object,有以下属性:
- error_code: 字符串,为"0" 代表成功。
- error_message: 错误消息,当error_code不为"0"时有值。
- result: 云函数的返回值,经过JSON序列后之后的数据。
#
2.1 作为行操作项行操作项是指在管理界面的数据表格右侧的操作菜单,即对某一条数据进行操作的选项。lightning的管理页面配置支持调用云函数作为一个操作项,操作步骤如下:
- 打开指定Model的页面配置面板,在列表页设置 -> 操作项 一节中,添加操作项,选择云函数,点击确认创建一个新操作。
- 在操作项列表中展开刚创建的操作,可修改操作名(即菜单名),函数名填上云函数的名字(lightning_func装饰器里用的name),再填写json object参数,lightning会自动增加id字段到该参数里面。
- 保存配置即可看到操作菜单新增了一项。
- 此时,在表格上任意一行上点击新建的操作项,该操作将调用指定的云函数,成功后会提示成功并重新加载页面的数据。
#
2.2 作为全局操作项全局操作是指在管理界面数据表格左上角的操作按钮,例如新建按钮。lightning的管理页面配置支持调用云函数作为一个全局操作项,操作步骤与行操作项类似,在此不赘述,全局操作项在配置面板的位置:列表页设置 -> 全局操作。添加云函数类型操作后,可以配置调用的云函数及参数。
#
2.3 作为批量操作项全局操作是指在管理界面数据表格左上角的批量操作选项。lightning的管理页面配置支持调用云函数作为一个全局操作项,操作步骤与行操作项类似,在此不赘述,全局操作项在配置面板的位置:列表页设置 -> 批量操作,添加云函数类型操作后,可以配置调用的云函数及参数。