Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用GraphQL模式进行类似JSON模式的数据验证?_Python_Json_Validation_Graphql_Jsonschema - Fatal编程技术网

Python 如何使用GraphQL模式进行类似JSON模式的数据验证?

Python 如何使用GraphQL模式进行类似JSON模式的数据验证?,python,json,validation,graphql,jsonschema,Python,Json,Validation,Graphql,Jsonschema,我们正在研究将GraphQL用于我们正在开发的无头CMS的版本2 在这个CMS的版本1中,我们使用JSON模式在保存到数据库中之前根据模式验证每个文档——例如,如果是博客文章,它将根据文章模式进行验证,如果是综述(“最佳”列表),它将根据综述模式进行验证 对于版本2,我们正在考虑将GraphQL用于API。然后我们意识到GraphQL模式基本上与JSON模式并行——它描述文档结构、字段类型等 因此,我们可以简单地拥有“模式真理的一个来源”,即GraphQL模式,并将其用于查询文档和在保存新修订时

我们正在研究将GraphQL用于我们正在开发的无头CMS的版本2

在这个CMS的版本1中,我们使用JSON模式在保存到数据库中之前根据模式验证每个文档——例如,如果是博客文章,它将根据
文章
模式进行验证,如果是综述(“最佳”列表),它将根据
综述
模式进行验证

对于版本2,我们正在考虑将GraphQL用于API。然后我们意识到GraphQL模式基本上与JSON模式并行——它描述文档结构、字段类型等

因此,我们可以简单地拥有“模式真理的一个来源”,即GraphQL模式,并将其用于查询文档和在保存新修订时验证新文档。(注意,我说的是根据GraphQL模式验证JSON数据,而不是根据模式验证GraphQL查询。)

我认为数据将根据模式中的所有字段进行验证,不推荐的字段除外,因为您只想根据字段的“最新版本”进行验证

我们可以做三件事之一:

  • 直接使用GraphQL AST验证文档,即自己编写数据验证器
  • 使用GraphQL AST生成JSON模式,并使用标准JSON模式验证器对其进行实际验证
  • 只需接受GraphQL不太适合进行验证,并定义两次模式——一次在GraphQL中进行查询,另一次在JSON模式中进行验证(让它们保持同步既烦人又容易出错)
  • 问题:1和2是愚蠢的想法吗?是否有任何GraphQL工具可以进行这种数据验证?有没有其他方法可以在不定义两次模式的情况下实现这一点

    作为参考,我们的后端将用Python编写,但管理UI将是客户端和JavaScript。这是我们正在讨论的GraphQL模式的简化版本(支持“Article”和“Roundup”文档类型):

    不断变化的局势中的确定程度 GraphQL仍然是一种不断发展的技术(),因此可以肯定地说,对于这一点没有真正“正确”的答案

    概括性 InputObject类型(接口定义语言术语中的“输入”)和列表(IDL术语中的“[]”)以及各种标量似乎完全涵盖了JSON中的功能

    如果GraphQL的Python实现符合规范,那么作为GraphQL文本或(更好)作为“变量”提供数据应该提供定制验证所能提供的一切:GraphQL验证将做正确的事情

    对你的情况的建议 根据我目前在GraphQL方面的工作,我的建议是“随大流”。如果您的GraphQL模式符合数据体系结构的要求,只需使用普通的GraphQL验证即可。如果您确实进行了自己的验证,那么它应该在GraphQL完成正常的数据形状检查之后进行


    总结以上几点,并用一个问题回答您的问题:让GraphQL在其正常功能中执行验证重担有什么不对?

    您知道吗?我用你的graphql模式试过了,基本的对我来说很好。问题可能出在细节上。您想使用GraphQL有什么原因吗?看来你会损失很多,因为你有实际的模式验证。您好,刚刚遇到您的问题,在我们公司,我们想使用GraphQL来模式/验证我们的JSON产品,您最终找到了解决方案吗?谢谢。进一步研究后,我认为主要问题是输入类型不能是或包含联合。我们的模式肯定包含联合,所以我们不能将其用作突变的输入类型(没有hacks)。另请看,对于每种输入类型,可以有一个输入查询(无论是
    查询
    还是
    变异
    ),我是否错了?(您将从现有的输入联合自动生成它们)或者您是说您的请求者不知道它是哪种类型?如果是这样的话,您可以有一个通用的“分派”查询,其输出是联合类型?我不完全确定您的建议:您的意思是有
    updateArticle()
    updaterundup()
    突变吗?是的,你可以这样做。内部联合仍然是一个问题,例如上面的
    articlessection
    ——您可以使用
    articlessectioninput
    类型,为联合中的每种类型提供可为空的字段,例如:
    textssection
    photoSection
    videoSection
    。。。但它相当混乱。我是说有
    updateArticle
    updateRoundup
    。您还需要
    createTextSection
    createPhotoSection
    ,等等。因为它是输入,所以您知道自己在做什么,所以不需要多态性。鉴于GraphQL已经规定了输入和输出对象之间的分离,无论您做什么,都会有一定程度的重复。
    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
    }