python中restapi输入验证的avroidl

2021-12-08 06:21:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我们一直在使用avroidl来定义Kafka后端使用的消息集,对此我们非常满意。我们还对将JSON与带有Avro模式的Python Flask应用程序上的restapi绑定很感兴趣,并且遇到了一些困难。你知道吗

有各种各样的软件包在那里,但我还没有找到明确的工作方式,我需要它。我希望得到一些指导。你知道吗

我可以使用avdl文件生成一组avsc文件:

avro-tools idl2schemata message.avdl output_dir

或者

avro-tools idl message.avdl > output_dir/schema.avsc

我可以用python阅读这些内容,但是我发现没有什么“简单”的东西可以告诉我JSON输入是否与模式匹配。你知道吗

有人做过类似的事吗?我走错路了吗?如有任何建议,将不胜感激。你知道吗

我知道如果我在春靴球场踢球,这可能会很简单。你知道吗

谢谢

IDL公司

@namespace("org.jeeftor.avro")
protocol TacoRequest {

enum MeatType{
  CHICKEN,
  BEEF,
  TURKEY,
  FISH
}

enum CheeseType {
  GROSS_VEGAN,
  ACTUAL_COW_CHEESE,
  GOAT_CHEESE
}

enum Toppings {
  LECHUGA,
  TOMATO,
  SAUCE
}

record Taco {
  MeatType meat;
  CheeseType cheese;
  array<Toppings> toppings;
}


record Order {
  union { string, int } order_id;

  array<Taco> tacos;
}

}

架构

我用:avro-tools idl order.avdl protocol.avpr生成模式

{
  "protocol" : "TacoRequest",
  "namespace" : "org.jeeftor.avro",
  "types" : [ {
    "type" : "enum",
    "name" : "MeatType",
    "symbols" : [ "CHICKEN", "BEEF", "TURKEY", "FISH" ]
  }, {
    "type" : "enum",
    "name" : "CheeseType",
    "symbols" : [ "GROSS_VEGAN", "ACTUAL_COW_CHEESE", "GOAT_CHEESE" ]
  }, {
    "type" : "enum",
    "name" : "Toppings",
    "symbols" : [ "LECHUGA", "TOMATO", "SAUCE" ]
  }, {
    "type" : "record",
    "name" : "Taco",
    "fields" : [ {
      "name" : "meat",
      "type" : "MeatType"
    }, {
      "name" : "cheese",
      "type" : "CheeseType"
    }, {
      "name" : "toppings",
      "type" : {
        "type" : "array",
        "items" : "Toppings"
      }
    } ]
  }, {
    "type" : "record",
    "name" : "Order",
    "fields" : [ {
      "name" : "order_id",
      "type" : [ "string", "int" ]
    }, {
      "name" : "tacos",
      "type" : {
        "type" : "array",
        "items" : "Taco"
      }
    } ]
  } ],
  "messages" : { }
}

我的问题是如何轻松地使用这个“模式”来验证输入。你知道吗