将wtforms转换为json模式的包
wtforms-jsonschema2的Python项目详细描述
wtforms jsonschema 2
wtforms jsonschema 2是一个转换器,用于将使用wtforms生成的表单转换为遵循jsonschema语法的ordereddict。
它是独立于wtforms_jsonschema开发的。主要的区别在于它经过了单元测试,增加了对验证器的支持,并且更易于扩展。也就是说,并非wtforms_jsonschema支持的所有字段都受wtforms_jsonschema2支持。
原始wtform字段的顺序保持不变。 用例是将这些表单与随后将显示这些表单的其他应用程序进行通信。例如,后端可以使用Flask Appbuilder生成一个简单的crud应用程序,但也可以将某些表单公开给在Angular中或在使用Ionic的移动应用程序中生成的另一个前端。
安装
从github克隆存储库,并用
pip install wtforms_jsonschema2
如果还需要Flask Appbuilder支持,请使用
安装pip install wtforms_jsonschema2[fab]
如果希望Flask AppBuilder中的几何列支持GeoAlchemy2,请使用
pip install wtforms_jsonschema[geofab]
测试
单元测试可以使用
python setup.py test
或
pytest
用法
下面是该软件包的工作原理示例:
fromwtforms_jsonschema.baseimportBaseConverterfromwtforms.formimportFormfromwtformsimportvalidatorsfromwtforms.fields.coreimportStringField,DecimalField,SelectField,IntegerField,Field,DateTimeFieldfromwtforms.widgetsimportTextInputfrompprintimportpprintclassSimpleTestForm(Form):"""Simple Test Form displaying the conversion features"""first_name=StringField('First Name',validators=[validators.required()])nick_name=StringField('Nickname')age=IntegerField('Age',validators=[validators.number_range(0,10),validators.required()])average=DecimalField('Average',validators=[validators.number_range(10,1000)])gender=SelectField("Gender",choices=['Male','Female','Alien','Other'])some_field=SelectField("Bla",choices=[1,2,3])some_field2=SelectField("Bla",choices=[1.5,2.2,3])email=StringField('Email Address',validators=[validators.Email()])length_string=StringField('Name',validators=[validators.Length(5,10)])dt=DateTimeField('DateTime')converter=BaseConverter()pprint(converter.convert(SimpleTestForm))
输出:
OrderedDict([('type','object'),('properties',OrderedDict([('first_name',{'title':'First Name','type':'string'}),('nick_name',{'title':'Nickname','type':'string'}),('age',{'maximum':10,'minimum':0,'title':'Age','type':'integer'}),('average',{'maximum':1000,'minimum':10,'title':'Average','type':'number'}),('gender',{'enum':['Male','Female','Alien','Other'],'title':'Gender','type':'string'}),('some_field',{'enum':[1,2,3],'title':'Bla','type':'integer'}),('some_field2',{'enum':[1.5,2.2,3],'title':'Bla','type':'number'}),('email',{'format':'email','title':'Email Address','type':'string'}),('length_string',{'maxLength':10,'minLength':5,'title':'Name','type':'string'}),('dt',{'format':'date-time','title':'DateTime','type':'string'})])),('required',['first_name','age'])])
还支持Flask AppBuilder及其视图。 例如: 以下模型和视图
class Person(Model):
id = Column(Integer, primary_key=True)
name = Column(String)
class Picture(Model):
id = Column(Integer, primary_key=True)
picture = Column(Text)
person_id = Column(Integer, ForeignKey(person.id), nullable=False)
person = relationship(Person, backref="pictures")
class PictureView(ModelView):
list_title = 'Pictures'
add_title = 'Add Picture'
edit_title = 'Edit Picture'
show_title = 'Picture'
datamodel = Picture
add_columns = ['picture']
class PersonView(ModelView):
show_title = 'Person'
edit_title = 'Edit Person'
add_title = 'Add Person'
list_title = 'People'
datamodel = Person
related_views = [PictureView]
add_columns = ['name']
converter.convert({'Person': PersonView})
应生成以下架构:
{
"type": "object",
"definitions": {
"Person": {
"type": "object",
"properties": {
"name": {"type": "string"},
"pictures": {
"type": "array",
"title": "Pictures",
"items": [
{"$ref": "#/definitions/Picture"}
]
}
}
},
"Picture": {
"type": "object",
"properties": {
"picture: {"type": "string"}
}
}
},
"properties": {
"Person": {"$ref": "#/definitions/Person"}
}
}
库还支持flask appbuilder的fab_addon_geoalchemy插件, 它通过geoalchemy2添加了对postgis几何列的支持 用于sqlalchemy的库。例如:
fromwtforms_jsonschema2.geofabimportGeoFABConverterfromfab_addon_geoalchemy.modelsimportGeometry,GeoSQLAInterfacefromfab_addon_geoalchemy.viewsimportGeoModelViewfromflask_sqlalchemyimportSQLAfromsqlalchemyimportColumn,Integer,Stringapp=Flask('myapp')app.config.update(cfg)db=SQLA(app)appbuilder=AppBuilder(app,db.session)classGeoObservation(db.Model):id=Column(Integer,primary_key=True)name=Column(String,nullable=False)location=Column(Geometry(geometry_type='POINT',srid=4326),nullable=False)def__repr__(self):returnself.nameclassGeoObservationView(GeoModelView):datamodel=GeoSQLAInterface(GeoObservation)add_columns=['name','location']show_title='GeoObservation'add_title='Add GeoObservation'appbuilder.add_view(GeoObservationView,'observations')ctx=app.app_context()ctx.push()db.create_all()db.session.commit()converter=GeoFABConverter()schema=converter.convert(GeoObservationView)pprint(schema)
输出:
OrderedDict([('type','object'),('definitions',OrderedDict([('GeoObservation',OrderedDict([('type','object'),('properties',OrderedDict([('name',{'type':'string','title':'Name'}),('location',OrderedDict([('type','object'),('properties',OrderedDict([('lat',{'type':'number','title':'Latitude',}),('lon',{'type':'number','title':'Longitude'})])),('required',['lat','lon']),('title','Location')])),])),('required',['name'])]))])),('type','object'),('properties',OrderedDict([('GeoObservation',{'$ref':'#/definitions/GeoObservation'})]))])
延伸
库基于wtforms_jsonschema2.base.BaseConverter
类。
这个类的方法都用@converts(*<classes>)
修饰。
这些转换方法返回元组(field type,options,required),分别是一个字符串、dict和boolean,表示jsonschema类型、字段的附加参数(如enum)或从验证器派生的其他值限制,以及是否需要该字段。
若要支持其他字段,请通过向转换特定字段的BaseConverter类添加函数来提供支持, 或者创建一个继承自baseconverter并为特定字段类型添加函数的新类。
这是decimalfield的一个示例:
fromwtforms.fields.coreimportDecimalFieldfromwtforms.validatorsimportNumberRangefromwtforms_jsonschema.baseimportBaseConverter,convertsclassMyConverter(BaseConverter):@converts(DecimalField)defdecimal_field(self,field):fieldtype='number'options={}required=Falsevals=dict([(v.__class__,v)forvinfield.validators])required=self._is_required(vals)ifNumberRangeinvals.keys():options['minimum']=vals[NumberRange].minoptions['maximum']=vals[NumberRange].maxreturnfieldtype,options,required
学分
wtforms jsonschema 2是由Dolf Andringa开发的,但其灵感来自Flask-Admin的sqlalchemy转换组件(特别是@converts decorator)。