python validator Comment utiliser un schéma GraphQL pour la validation des données de type JSON Schema?



python json schema validation (1)

Niveau de certitude dans l'évolution de la situation

GraphQL est toujours une technologie en constante évolution ( comme il est dit tout en haut du document spec ), donc il est sûr de dire qu'il n'y a pas vraiment de réponses "correctes" pour cela.

Généralités

Les types InputObject ("entrée" dans les termes du langage de définition d'interface) avec les listes ("[]" dans les termes IDL) ainsi que les différents scalaires semblent couvrir complètement ce que vous pouvez faire dans JSON.

Si l'implémentation Python de GraphQL est conforme à la spécification, alors fournir des données sous forme de littéraux GraphQL ou (mieux) en tant que "variables" devrait fournir tout ce qu'une validation personnalisée pourrait faire: La validation de GraphQL fera la bonne chose.

Recommandation pour votre situation

Basé sur mon travail avec GraphQL jusqu'ici, ma suggestion est de "aller avec le grain". Si votre schéma GraphQL est conforme à ce que requiert votre architecture de données, utilisez simplement une validation GraphQL normale. Si vous faites votre propre validation, cela devrait venir après que GraphQL ait fait sa vérification normale de la forme des données.

Pour résumer les points ci-dessus, et répondre à votre question par une question: qu'est-ce qui ne va pas de laisser GraphQL dans son fonctionnement normal faire la lourde opération de validation?

Nous cherchons à utiliser GraphQL pour la version 2 d'un CMS sans head que nous développons.

Dans la version 1 de ce CMS, nous avons utilisé JSON Schema pour valider chaque document par rapport à un schéma avant de l'enregistrer dans la base de données. Par exemple, s'il s'agit d'un article de blog, il sera validé par rapport au schéma Article . "best of" liste) il serait validé par rapport au schéma Roundup .

Pour la version 2, nous envisageons d'utiliser GraphQL pour l'API. Et puis il nous est apparu que le schéma GraphQL est fondamentalement parallèle au schéma JSON - il décrit la structure du document, les types de champs, etc.

Nous pourrions donc simplement avoir «une source de vérité de schéma», le schéma GraphQL, et l'utiliser à la fois pour interroger des documents et pour valider de nouveaux documents lorsqu'une nouvelle révision est en cours d'enregistrement. (Notez que je parle de valider des données JSON par rapport à un schéma GraphQL, sans valider une requête GraphQL par rapport à un schéma.)

Je suppose que les données seront validées par rapport à tous les champs du schéma, à l'exception des champs obsolètes, car vous ne voulez valider que par rapport à la "dernière version" des champs.

Nous pourrions faire l'une des trois choses suivantes:

  1. Utilisez directement l'AST GraphQL pour valider un document, c'est-à-dire écrire lui-même un validateur de données.
  2. Utilisez l'AST GraphQL pour générer un schéma JSON et utilisez un validateur JSON Schema standard pour le valider.
  3. Acceptez simplement que GraphQL n'est pas tout à fait la bonne pour la validation, et définissez le schéma deux fois - une fois dans GraphQL pour l'interrogation, et encore dans JSON Schema pour la validation (ennuyeux et sujet aux erreurs de les garder synchronisés).

Questions: Les idées stupides # 1 et # 2? Existe-t-il des outils GraphQL qui effectuent ce type de validation de données? Existe-t-il d'autres moyens d'y parvenir sans définir le schéma deux fois?

Pour référence, notre backend sera écrit en Python mais l'interface utilisateur d'administration sera React et JavaScript côté client. C'est une version réduite du type de schéma GraphQL dont nous parlons (supporte les types de document "Article" et "Roundup"):

schema {
    query: Query
}

type Query {
    documents: [Document!]!
    document(id: Int): Document!
}

interface Document {
    id: Int!
    title: String!
}

type Article implements Document {
    id: Int!
    title: String!
    featured: Boolean!
    sections: [ArticleSection!]!
}

union ArticleSection = TextSection | PhotoSection | VideoSection

type TextSection {
    content: String!
    heading: String
}

type PhotoSection {
    sourceUrl: String!
    linkUrl: String
    caption: String
    content: String
}

type VideoSection {
    url: String!
}

type Roundup implements Document {
    id: Int!
    title: String!
    isAward: Boolean!
    intro: String
    hotels: [RoundupHotel!]!
}

type RoundupHotel {
    url: String!
    photoUrl: String @deprecated(reason: "photoUrl is deprecated; use photos")
    photos: [RoundupPhoto!]!
    blurb: String!
    title: String
}

type RoundupPhoto {
    url: String!
    caption: String
}




jsonschema