用于Python中的Rest Api输入验证的Avro IDL

时间:2019-06-14 20:11:30

标签: python flask avro

我们一直在使用Avro IDL定义在Kafka后端上使用的消息集,对此感到非常满意。我们还想将JSON绑定到具有Avro Schema的Python Flask应用上的REST api上,并且遇到了一些困难。

那里有各种各样的软件包,但是我还没有找到可以按照我需要的方式工作的软件包。我希望获得一些指导。

我可以使用以下文件来获取我的avdl文件并生成一组avsc文件:

avro-tools idl2schemata message.avdl output_dir

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

我能够用python读取这些内容,但是我发现没有什么“简单”的内容可以告诉我JSON输入是否与模式匹配。

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

我知道如果我在SpringBoot领域玩游戏,那可能很简单。

谢谢

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" : { }
}

我的问题是如何轻松使用此“模式”来验证输入。

0 个答案:

没有答案