Skip to content

biohub.utils

Xie Jingyi edited this page Jul 17, 2017 · 1 revision

概述

为了解耦与降低代码重复度,此模块(将)收纳一些有用的辅助函数、辅助类。

大家可以一起贡献这个库,但需要注意的是:本模块只许放置对现有库的改进或是一些常用的用于简化开发流程的代码,与 biohub 业务逻辑相关的代码不得收录于此。

biohub.utils.path

filepath(filename)

接收文件名,返回包含给定文件的目录的 真实绝对路径,若是文件是符号链接则会跟随链接跳转。

modpath(modpath)

接收一个模块名(如 biohub.core),返回包含此模块 __init__.py 的目录的真实绝对路径。

biohub.utils.rest

此模块是对 rest_framework 的改进。

biohub.utils.rest.pagination

factory(base_class_name, **options)

pagination class 的工厂方法,用于快速自定义符合自己需求的分页类。base_class_name 需是 rest_framework.pagination 中已存在的类的名称,多余的参数会被当做此类的类成员。

示例:

# biohub.accounts.views
pagination_class = pagination.factory('CursorPagination', page_size=20)

biohub.utils.rest.permissions

C

这是第三方库 rest_condition 中的一个类,用于生成复杂的权限类。

check_owner(field_name=None, methods=('PUT', 'PATCH'))

一个工厂方法,用于生成有如下功能的权限类:当 HTTP Method 是 methods 中一者时,检查被指向的对象的 field_name 域是否为当前 request.user(若 field_nameNone,则将 对象本身 与 request.user 比较)。

示例:

from biohub.utils.rest import permissions as p

class UserViewSet(...):
    # ...
    permission_classes = [p.check_owner()] # 当用户尝试修改指向用户的信息时,系统检查该用户是否为当前已登录的用户

class NoticeViewSet(...):
    # ...
    permission_classes = [p.check_owner('user', ('GET',))]

class NoticeViewSet(...):
    # ...
    permission_classes = [p.C(p.IsAuthenticated) & p.check_owner('user', ('GET',))] # 组合复杂的权限逻辑

biohub.utils.rest.serializers

DynamicSerializerMixin

一个 Mixin 类,使 serializer 具有 在实例化时指定 fields 的功能

ModelSerializer, HyperlinkedModelSerializer

聚合了 DynamicSerializerMixinModelSerializerHyperlinkedModelSerializer

示例:

from biohub.utils.rest.serializers import ModelSerializer

class UserSerializer(ModelSerializer):

    class Meta:
        model = User
        fields = '__all__'

serializer = UserSerializer(fields = ('id', 'username'))  # 使用 serializer 序列化/反序列化 只会关注 id, username 两个字段

@bind_model(model_class, can_override=False)

带参类装饰器,用于将一个 model class 与一个 serializer class 联系起来。这样做的好处是:当你想获取一个 model class 的 serializer (用于 nested serializing 等)时,你不必关注该 serializer 的定义位置即可获取之,一定程度上降低了两个模块的耦合度。可选参数 can_override 指定该绑定关系是否可以被覆盖。

get_by_model(model_class)

获取与 model_class 绑定的 serializer。

示例:

from biohub.utils.rest import serializers as s

@s.bind_model(User)
class UserSerializer(s.ModelSerializer):

    pass

s.get_by_model(User) is UserSerializer # True