【问题标题】:restrict access to certain fields of model限制对模型某些字段的访问
【发布时间】:2020-01-14 03:55:19
【问题描述】:

我有一个 mongoengine 模型,它有一些公共字段和一些我想隐藏的字段,例如“用户”组。那么,限制对某些字段的访问的聪明方法是什么?

我的堆栈是 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

【问题讨论】:

    标签: flask mongoengine flask-restful


    【解决方案1】:

    我建议在模型类中定义序列化程序并使用字段(来自 flask_restful)来定义它。然后在您的控制器中,您可以使用 marshal_with 装饰器(或 marshal 函数)来序列化返回。

    # 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(...)
    

    这样只会返回序列化程序中指定的字段。

    注意1:你可以在任何你想要的地方定义序列化器,我只是喜欢它在模型中。

    注意2:marshal_with 句柄也会自动列出,因此return list(Article.objects) 也可以使用

    注意3:您可以创建多个序列化程序并根据情况不同地使用它们

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 2016-07-07
      • 2012-05-19
      • 2012-09-29
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多