基于python的web应用和/或api的对象模型映射器
OMM的Python项目详细描述
对象模型映射器
这是什么?
此脚本允许平坦/凹凸模型深度。
我为什么做这个?
当我使用MongoEngine时,我需要这样设计模型:
importmongoengineasdbclassRecentPrevAmount(db.EmbeddedDocument):recent=db.FloatField()prev=db.FloatField()classAssetInfo(db.Document):assets=db.EmbeddedDocumentField(RecentPrevAmount)cash=db.EmbeddedDocumentField(RecentPrevAmount)receivable=db.EmbeddedDocumentField(RecentPrevAmount)revenue=db.EmbeddedDocumentField(RecentPrevAmount)cogs=db.EmbeddedDocumentField(RecentPrevAmount)
并按上述顺序创建restapi,没有“undefiend property”错误, 需要创建5个CRUD资源:
[GET, POST, PUT, DELETE] /assets
[GET, POST, PUT, DELETE] /cash
[GET, POST, PUT, DELETE] /receivable
[GET, POST, PUT, DELETE] /revenue
[GET, POST, PUT, DELETE] /cogs
对于每个资源,输出/输入如下所示:
{"recent":10.0,"prev":14.0}
这意味着,需要发送大量请求来归档资产信息和 它可能有前端慢。为了避免这个问题,要发送的请求数 应尽量减少。理想的资源是 以下格式:
{"assets_recent":10.0,"assets_prev":11.0,"cash_recent":12.0,"receivable_prev":13.0,"revenue_recent":14.0,"cogs_prev":15.0}
当然,以上对公共api是不好的 (在公共api上,recent和prev应该嵌入到一个字段中) 但是上面的结构减少了请求的数量。
如何使用
我想你需要的是示例代码而不是文档。
展开模型
#!/usr/bin/env python# coding=utf-8"""Example code.Note that this is just an example."""importmongoengineasdbimportommimportwtforms.formsasformsimportwtforms.fieldsasfldimportwtforms.validatorsasvldfrom..apiimportapi,render,login_only# First, let's define the target models as usual.classAddress(db.EmbeddedDocument):street=db.ListField(db.StringField,required=True)city=db.StringField(required=True)state=db.StringField(required=True)country=db.StringField(required=True)classUser(db.Document):email=EmailField(primary_key=True)first_name=StringField(required=True)last_name=StringField(required=True)address=db.EmbeddedDocument(Address,required=True)@propertydeffull_name(self):return(" ").join([self.first_name,self.last_name])@full_name.setterdeffull_name(self,value):try:(self.first_name,self.last_name)=value.split(" ")exceptValueError:pass# Then, define the map.classUserMapper(omm.Mapper):# Note that set_cast can be non-list, i.e. str. However, in this case,# we use User because the root object type is User.fullname=omm.MapField("full_name",set_cast=[User,str])email=omm.MapField("email",set_cast=[User,str])# For third element should be list or any class that inherits list because# the target is typed as list.street1=omm.MapField("address.street[0]",set_cast=[User,Address,list,str])street2=omm.MapField("address.street[1]",set_cast=[User,Address,list,str])# Note that dot-notation is used to specify the member.city=omm.MapField("address.city",set_cast=[User,Address,str])state=omm.MapField("address.state",set_cast=[User,Address,str])country=omm.MapField("address.country",set_cast=[User,Address,str])classUserForm(forms.Form):fullname=fld.StringField(validators=[vld.DataRequired()])email=fld.StringField(validators=[vld.Email()])street1=fld.StringField(validators=[vld.DataRequired()])street2=fld.StringField(validators=[vld.Optional()])city=fld.StringField(validators=[vld.DataRequired()])state=fld.StringField(validators=[vld.DataRequired()])country=fld.StringField(validators=[vld.DataRequired()])classUserController(object):# User APIdefget(self,id):# GET request.user=User.objects()mapper=UserMapper(user)returnrender(mapper.to_json(),mimetype="application/json")defpost(self):# POST request.form=UserForm(api.request.json())ifnotform.validate():returnrender(api.jsonify(form.errors),mimetype="application/json",code=417)mapper=UserMapper()form.populate_obj(mapper)mapper.connected_object.save()@login_onlydefput(self,uid):# PUT request.form=UserForm(api.request.json())ifnotform.validate():returnrender(api.jsonify(form.errors),mimetype="application/json",code=417)mapper=UserMapper(User.objects(uid))form.populate_obj(mapper)mapper.connected_object.save()api.register(UserController)
增加模型深度
目前,我正在考虑(并设计)访问多个模型的方法 通过地图绘制者。不幸的是,这些功能还没有实现。
其他功能
阅读code
许可证(麻省理工学院许可证)
版权所有(c)2016 Hiroaki Yamamoto
兹免费准许任何人取得副本 本软件和相关文档文件(“软件”)的 在软件中不受限制,包括但不限于 使用、复制、修改、合并、发布、分发、再授权和/或出售 软件的副本,并允许软件的用户 在满足以下条件的情况下,可以这样做:
上述版权公告及本许可公告须包括在 软件的拷贝或大部分。
本软件按“原样”提供,无任何形式的保证,明示或 默示的,包括但不限于适销性保证, 适合特定目的和不侵权。在任何情况下 作者或版权所有者应对任何索赔、损害或其他 责任,无论是在合同诉讼、侵权诉讼或其他诉讼中, 不属于或与本软件有关,或使用或与本软件的其他交易有关。 软件。