-
Notifications
You must be signed in to change notification settings - Fork 3
biohub.utils
为了解耦与降低代码重复度,此模块(将)收纳一些有用的辅助函数、辅助类。
大家可以一起贡献这个库,但需要注意的是:本模块只许放置对现有库的改进或是一些常用的用于简化开发流程的代码,与 biohub
业务逻辑相关的代码不得收录于此。
接收文件名,返回包含给定文件的目录的 真实绝对路径,若是文件是符号链接则会跟随链接跳转。
接收一个模块名(如 biohub.core
),返回包含此模块 __init__.py
的目录的真实绝对路径。
此模块是对 rest_framework
的改进。
pagination class 的工厂方法,用于快速自定义符合自己需求的分页类。base_class_name
需是 rest_framework.pagination
中已存在的类的名称,多余的参数会被当做此类的类成员。
示例:
# biohub.accounts.views
pagination_class = pagination.factory('CursorPagination', page_size=20)
这是第三方库 rest_condition 中的一个类,用于生成复杂的权限类。
一个工厂方法,用于生成有如下功能的权限类:当 HTTP Method 是 methods
中一者时,检查被指向的对象的 field_name
域是否为当前 request.user
(若 field_name
为 None
,则将 对象本身 与 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',))] # 组合复杂的权限逻辑
一个 Mixin 类,使 serializer 具有 在实例化时指定 fields 的功能。
聚合了 DynamicSerializerMixin
的 ModelSerializer
和 HyperlinkedModelSerializer
。
示例:
from biohub.utils.rest.serializers import ModelSerializer
class UserSerializer(ModelSerializer):
class Meta:
model = User
fields = '__all__'
serializer = UserSerializer(fields = ('id', 'username')) # 使用 serializer 序列化/反序列化 只会关注 id, username 两个字段
带参类装饰器,用于将一个 model class 与一个 serializer class 联系起来。这样做的好处是:当你想获取一个 model class 的 serializer (用于 nested serializing 等)时,你不必关注该 serializer 的定义位置即可获取之,一定程度上降低了两个模块的耦合度。可选参数 can_override
指定该绑定关系是否可以被覆盖。
获取与 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