** Je ne l'ai pas remarqué du tout quand je l'ai écrit, mais maintenant il semble qu'il soit passé à schematics. J'écrirai bientôt la version schematics ... peut-être. ** **
dictshield est une bibliothèque pour valider des objets JSON.
Comme il peut être défini par classe, il semble facile à utiliser car il est similaire au modèle et à la classe de formulaire de django que j'utilise habituellement, à la classe de document de mongoengine, etc., et la base de code est compacte et la visibilité est bonne. procès. Au fur et à mesure que vous suivez le code, il semble que MongoDB et JSON Schema soient également pris en compte.
documents.py
from dictshield.document import Document
from dictshield.fields import StringField, IntField, FloatField, BooleanField, DateTimeField
class SampleDocument(Document):
    id = IntField(min_value=0)
    name = StringField()
    gps_attached = BooleanField()
    temperature = FloatField()
    created_at = DateTimeField()
L'inspection des objets JSON convertit l'objet JSON en «dict», puis le jette dans la classe de document.
import json
json_data = '{"id": 1, "name": "foo", "gps_attached": true, "temperature": 23.5, "created_at": "2013-01-01T12:34:56" }'
data = json.loads(json_data)
document = SampleDocument(**data)
document.validate()  #True est retourné
Pour utiliser un objet JSON imbriqué (?), Utilisez la classe ʻEmbeddedDocument`. Un exemple de séparation des informations des capteurs périphériques.
documents.py
from dictshield.document import Document, EmbeddedDocument
from dictshield.fields import StringField, IntField, FloatField, BooleanField, DateTimeField
from dictshield.fields.compound import EmbeddedDocumentField
class PeripheralEmbeddedDocument(EmbeddedDocument):
    gps_attached = BooleanField()
    temperature = FloatField()
class SampleDocument(Document):
    id = IntField()
    name = StringField(max_length=5)
    created_at = DateTimeField()
    peripheral = EmbeddedDocumentField(PeripheralEmbeddedDocument)
data = {
    u'created_at': u'2013-01-01T12:34:56',
    u'id': 1,
    u'name': u'foo',
    u'peripheral': {
        u'gps_attached': True,
        u'temperature': 23.5
    }
}
document = SampleDocument(**data)
document.validate()  #True est retourné
Si la validation échoue, une ShieldException sera lancée.
data = {
    u'created_at': u'2013-01-01T12:34:56',
    u'id': 1,
    u'name': u'hogheoge',  #longue
    u'peripheral': {
        u'gps_attached': True,
        u'temperature': 23.5
    }
}
document = SampleDocument(**data)
document.validate()
---------------------------------------------------------------------------
ShieldException                           Traceback (most recent call last)
<ipython-input-76-8d15894a526a> in <module>()
----> 1 document.validate()
/somewhere/lib/python2.7/site-packages/dictshield/document.pyc in validate(self, validate_all)
    333                 # NB: raising a ShieldDocException in this case would be more
    334                 # consistent, but existing code might expect ShieldException
--> 335                 raise err
    336
    337         if errs:
ShieldException: String value is too long - name:hogheoge
max_value et min_value de ʻIntField` ne fonctionnent pas ...Recommended Posts