限制对模型某些字段的访问
restrict access to certain fields of model
我有一个 mongoengine 模型,它有一些 public 字段和一些我想隐藏的字段,例如 'user' 组。那么,限制对某些字段的访问的聪明方法是什么?
我的堆栈是 Flask-Restful + mongoengine
我的想法是编写自定义资源序列化程序和一个应该做限制的装饰器。但是,不清楚的一点 - 这个装饰器应该从函数输出中删除一些字段,还是相反,添加一些适合角色的字段?
@staticmethod
def serialize_operator(event):
json_to_decode = {
"id" : str(event.id),
"title" : event.title,
"description" : event.description,
"type" : event.type # so I want to hide this field
}
return json.loads(json.dumps(json_to_decode))
@get_auth
@some_restriction_decorator(user = get_auth())
def get(self):
pass
我建议在模型 class 中定义序列化程序并使用字段(来自 flask_restful)来定义它。然后在你的控制器中,你可以使用 marshal_with 装饰器(或 marshal 函数)来序列化 return.
# Model definition
from mongoengine import Document, StringField
from flask_restful import fields
class Article(Document):
title = StringField()
description = StringField()
type = StringField()
public_serializer = {
'id': fields.String,
'title': fields.String,
'description': fields.String
}
# Controller
from flask_restful import marshal_with
...
@marshal_with(Article.public_serializer)
def get(self):
return Article.objects.get(...)
这样只有在序列化程序中指定的字段才会被 returned。
注意 1:你可以在任何你想要的地方定义序列化器,我只是喜欢它在模型中。
注意 2:marshal_with 句柄也会自动列出,因此 return list(Article.objects)
也可以工作
注意3:可以创建多个序列化器,根据情况不同使用
我有一个 mongoengine 模型,它有一些 public 字段和一些我想隐藏的字段,例如 'user' 组。那么,限制对某些字段的访问的聪明方法是什么?
我的堆栈是 Flask-Restful + mongoengine
我的想法是编写自定义资源序列化程序和一个应该做限制的装饰器。但是,不清楚的一点 - 这个装饰器应该从函数输出中删除一些字段,还是相反,添加一些适合角色的字段?
@staticmethod
def serialize_operator(event):
json_to_decode = {
"id" : str(event.id),
"title" : event.title,
"description" : event.description,
"type" : event.type # so I want to hide this field
}
return json.loads(json.dumps(json_to_decode))
@get_auth
@some_restriction_decorator(user = get_auth())
def get(self):
pass
我建议在模型 class 中定义序列化程序并使用字段(来自 flask_restful)来定义它。然后在你的控制器中,你可以使用 marshal_with 装饰器(或 marshal 函数)来序列化 return.
# Model definition
from mongoengine import Document, StringField
from flask_restful import fields
class Article(Document):
title = StringField()
description = StringField()
type = StringField()
public_serializer = {
'id': fields.String,
'title': fields.String,
'description': fields.String
}
# Controller
from flask_restful import marshal_with
...
@marshal_with(Article.public_serializer)
def get(self):
return Article.objects.get(...)
这样只有在序列化程序中指定的字段才会被 returned。
注意 1:你可以在任何你想要的地方定义序列化器,我只是喜欢它在模型中。
注意 2:marshal_with 句柄也会自动列出,因此 return list(Article.objects)
也可以工作
注意3:可以创建多个序列化器,根据情况不同使用