限制对模型某些字段的访问

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:可以创建多个序列化器,根据情况不同使用