当前位置: 首页 > 知识库问答 >
问题:

API JSON架构验证与可选元素使用Pyd的

林祯
2023-03-14

我使用来自pydantic的fastapi和BaseModel来验证和记录api返回的JSON模式。

这适用于固定返回,但我有更改返回的可选参数,因此我想将其包含在验证中,但当参数丢失并且该字段未在API中返回时,它不会失败。

例如:我有一个名为透明度的可选布尔参数,当它设置为 true 时,我返回一个名为 search_transparency 的块,并返回弹性查询。

{
  "info": {
    "totalrecords": 52
  },
  "records": [],
  "search_transparency": {"full_query": "blah blah"}
}

如果未设置参数 transparency=true,我希望返回为:

{
  "info": {
    "totalrecords": 52
  },
  "records": []
}

但是,当我在pydantic中将该元素设置为可选时,我得到的是返回以下内容:

{
  "info": {
    "totalrecords": 52
  },
  "records": [],
  "search_transparency": None
}

我对记录下的字段有类似的东西。默认值是字段的最小返回,但是如果您设置参数满=真,那么您会返回更多字段。我想以类似的方式处理这个问题,字段只是不存在,而不是显示为的值。

这就是我用pydantic处理的方式:

class Info(BaseModel):
    totalrecords: int

class Transparency(BaseModel):
    full_query: str

class V1Place(BaseModel):
    name: str

class V1PlaceAPI(BaseModel):
    info: Info
    records: List[V1Place] = []
    search_transparency: Optional[Transparency]

这就是我用fastapi强制验证的方式:

< code > @ app . get("/API/v1/place/search ",response_model=V1PlaceAPI,tags=["v1_api"])

我怀疑也许我试图实现的是糟糕的 API 实践,也许我不应该有可变回报。

我应该创建多个单独的endpoint来处理这个问题吗?

例如api/v1/place/search?q=测试vsapi/v1/place/full/transparent/search?q=测试

编辑

我的API函数的更多细节:

@app.get("/api/v1/place/search", response_model=V1PlaceAPI, tags=["v1_api"])

def v1_place_search(q: str = Query(None, min_length=3, max_length=500, title="search through all place fields"),
                    transparency: Optional[bool] = None,
                    offset: Optional[int] = Query(0),
                    limit: Optional[int] = Query(15)):

    search_limit = offset + limit

    results, transparency_query = ESQuery(client=es_client,
                                          index='places',
                                          transparency=transparency,
                                          track_hits=True,
                                          offset=offset,
                                          limit=search_limit)

    return v1_place_parse(results.to_dict(), 
    show_transparency=transparency_query)

其中ESQuery仅返回弹性搜索响应。这是我的解析函数:

def v1_place_parse(resp, show_transparency=None):
    """This takes a response from elasticsearch and parses it for our legacy V1 elasticapi

    Args:
        resp (dict): This is the response from Search.execute after passing to_dict()

    Returns:
        dict: A dictionary that is passed to API
    """

    new_resp = {}
    total_records = resp['hits']['total']['value']
    query_records = len(resp.get('hits', {}).get('hits', []))

    new_resp['info'] = {'totalrecords': total_records,
                        'totalrecords_relation': resp['hits']['total']['relation'],
                        'totalrecordsperquery': query_records,
                        }
    if show_transparency is not None:
        search_string = show_transparency.get('query', '')
        new_resp['search_transparency'] = {'full_query': str(search_string),
                                           'components': {}}
    new_resp['records'] = []
    for hit in resp.get('hits', {}).get('hits', []):
        new_record = hit['_source']
        new_resp['records'].append(new_record)

    return new_resp

共有1个答案

公西修文
2023-03-14

如果该字段是可以完成工作,则可能排除该字段。

只需添加一个 response_model_exclude_none = True 作为路径参数

@app.get(
    "/api/v1/place/search",
    response_model=V1PlaceAPI,
    tags=["v1_api"],
    response_model_exclude_none=True,
)

您可以自定义您的响应模型,甚至更多,这里是我的一个很好的解释的答案,我真的建议你看看。

 类似资料:
  • 下面是XSD。 下面是xml文件。 当尝试使用http://www.utilities-online.info/xsdvalidation验证它时,我得到以下错误 第2行62:org.xml.sax.SAXParseException;行号:2;列号:62;CVC-ELT.1:找不到元素“Message”的声明。

  • 问题内容: 我有一个简单的类,其属性之一为String数组。根据本文档,在数组,集合等上使用@Valid将递归地验证数组/集合的每个元素。 上面对属性的注释生成以下异常: 我正在使用Apache BVal作为验证提供程序。 问题是,上述方法正确吗? 如果不正确,那么使用bean验证来验证数组/集合的正确方法是什么? 如果正确,那么它对Apache BVal有一些限制吗? 问题答案: 通过像完成操作

  • 我正在尝试更新Dynamodb表用户中的一项。我尝试了许多不同的方法,但总是收到相同的错误消息: 提供的键元素与架构不匹配 项目的创建与查询一样有效,但更新不起作用。当我在DynamoDB上检查时,用户创建得很好: 下面是表格信息: 表名:用户 主分区键:电子邮件(字符串) 主排序键:注册(编号) 下面是代码(从lambda调用): 你知道我的代码中可能有什么错误吗?

  • 问题内容: 我找不到解决方案,发现更多人陷入同一问题,因此我将其发布在这里。 默认情况下,JAX-WS服务器(至少用于WebLogic)将不验证通过其关联架构接收到的消息。 由于任何无效值(错误的xsd:dateTime格式,数字字段中的字母等)都将导致Java对象(包括必填字段)中的 空 值,从而导致很多问题。 我需要做的是由服务器提供的简单验证。 由于某些原因,当我尝试使用提供的架构验证时,出

  • 我对XML非常陌生,我面临着验证问题,如果我的XML和XSD文件结构良好,我也希望得到一些反馈。 在根据XSD验证XML时,我经常遇到错误- 下面的XML XSD 如果你发现其中任何一个有任何错误,请随时指出。它们都有从图案到最大长度的限制。 谢谢!!!!

  • 我有一个数据帧,其中有一列是JSON字符串 并且希望使用模式解析< code>from_json的< code>json_str列 正如人们所看到的,第二行不符合,因此即使我在StructField中将传递到它也是空的。对于我的管道来说,如果存在不符合所定义架构的数据,则会以某种方式引发警报,但我不确定在Pyspark中执行此操作的最佳方法。真正的数据有很多很多的键,其中一些是嵌套的,所以用某种形