将wtforms转换为json模式的包

wtforms-jsonschema2的Python项目详细描述


wtforms jsonschema 2

Build status

wtforms jsonschema 2是一个转换器,用于将使用wtforms生成的表单转换为遵循jsonschema语法的ordereddict。

它是独立于wtforms_jsonschema开发的。主要的区别在于它经过了单元测试,增加了对验证器的支持,并且更易于扩展。也就是说,并非wtforms_jsonschema支持的所有字段都受wtforms_jsonschema2支持。

原始wtform字段的顺序保持不变。 用例是将这些表单与随后将显示这些表单的其他应用程序进行通信。例如,后端可以使用Flask Appbuilder生成一个简单的crud应用程序,但也可以将某些表单公开给在Angular中或在使用Ionic的移动应用程序中生成的另一个前端。

模式不是专门用来描述窗体的,但实际上是相当广泛的,并且提供足够的灵活性来很好地描述窗体。它支持字段的限制,类似于验证器,如电子邮件、URL、日期时间字符串格式、长度限制、数字的最小/最大值等。

安装

从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)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java 安卓 XMLPullParser错误   Java响应网格布局   Java中使用递归的不同方法   java变量可能尚未初始化(边加权图)   java如何将这样的文件插入MySQL数据库   java云端点:不允许实体类型的数组或集合   java(编译器或jvm)是否以不同方式处理类的静态最终成员?如果是,怎么做   java如何从lambda表达式返回新的非抽象映射?   java JDK 7支持的最大Spring版本是什么   我们如何从java类生成DTD   java在我的例子中BindingResult、FieldErrors或GlobalErrors是否可以为null?   java[LibGDX][GWT]读取文件外观时出错。HTML格式的json[序列化异常]   字典Java不可修改密钥集映射   java Admob在firebase sdk之后显示测试广告,但不显示真实广告