Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.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 如何根据FastApi中的另一个查询参数使查询参数成为必需的?_Python_Api - Fatal编程技术网

Python 如何根据FastApi中的另一个查询参数使查询参数成为必需的?

Python 如何根据FastApi中的另一个查询参数使查询参数成为必需的?,python,api,Python,Api,我想根据中的另一个查询参数设置一个必需的查询参数 例如,我有四个查询参数:command、start\u date、end\u date和increment 如果命令等于analysis,则必须要求结束日期。但若命令等于添加工作日,则不需要结束日期,但需要增量。这可能吗 这是我现在的代码: import datetime from fastapi import FastAPI, Query app = FastAPI() @app.get("/api/") async def read_

我想根据中的另一个查询参数设置一个必需的查询参数

例如,我有四个查询参数:command、start\u date、end\u date和increment

如果命令等于analysis,则必须要求结束日期。但若命令等于添加工作日,则不需要结束日期,但需要增量。这可能吗

这是我现在的代码:

import datetime
from fastapi import FastAPI, Query

app = FastAPI()  

@app.get("/api/")
async def read_item(
    start_date: str = Query(..., regex=r"[\d]{4}-[\d]{1,2}-[\d]{1,2}"),
    end_date: str = Query(..., regex=r"[\d]{4}-[\d]{1,2}-[\d]{1,2}"),
    command: str = None,
    increment: int = None,
):
    parsed_start_date = datetime.datetime.strptime(start_date, "%Y-%m-%d")
    parsed_end_date = datetime.datetime.strptime(end_date, "%Y-%m-%d")
    duration = parsed_end_date - parsed_start_date
    return duration.days

我建议将api分开

import datetime
from fastapi import FastAPI, Query

app = FastAPI()  

@app.get("/api/analyse")
async def read_item_for_analyse(
    start_date: str = Query(..., regex=r"[\d]{4}-[\d]{1,2}-[\d]{1,2}"),
    end_date: str = Query(..., regex=r"[\d]{4}-[\d]{1,2}-[\d]{1,2}"),
    increment: int = None,
):
    # do something 

@app.get("/api/add_working_days")
async def read_item_for_add_working_days(
    start_date: str = Query(..., regex=r"[\d]{4}-[\d]{1,2}-[\d]{1,2}"),
    end_date: str = None,
    increment: int = Query(..., title="Increase working days"),
):
    # do something 

它清晰易懂,或者继续你的风格,如果……足够的话再加上一些。

如果你按照你的建议写,你想做的是可能的。您可以将默认无值设置为参数,以允许一些灵活性,并执行规则验证,如:

If command == analyse:
  Check start_date is valid
  Check end_date is also valid
  Check increment is None

If command == add_working_days:
  Check start_date is valid
  Check end_date is None
  Check increment is also valid
但我的意见是,这不是做你想做的事情的正确方式

在上述情况下,FastAPI无法生成在GUI中表示参数组合的文档,例如

我的意见是

对于API的任何消费者来说,此类文档都是您的产品。 他们不清楚应该同时传递哪些参数组合。 您需要在说明中提供此类文档作为自由文本

由于开放式API规范是为了帮助开发人员尽可能快地相互理解而创建的,因此我建议您遵循该规范,避免此类规则组合

源于开放式API规范的FastAPI语法将无法描述根据您选择传递的参数将代码行为路由到不同函数的URL

也许,也许,也许如果这是Java,也许像招摇过市一样的工具可以支持您的代码,因为可以为同一个函数名编写多个签名,但由于这是Python,我不认为这是一种可行的行为

- 我的建议

遵循Nguy的答案ễn Nh–n。正如他所建议的,将不同的URL和参数组合描述为单独的路由器方法。这将使您无需设计复杂的IFs。这将向您的用户澄清,他们必须传递这样或那样的参数

免责声明

所有这些都是我认为正确的方法。其他人可能不同意。如果我必须考虑一个情况下,我将使用一个URL来完成这一切,这将是一个情况,每个可选参数添加到预期的功能,并且不依赖于任何其他参数。 例如:

domain/maps?location=XYZ&
add_markers: boolean
add_traffic: boolean
language: [EN,HE]
等等

在可能的情况下,提供链接

domain/maps?location=XYZ&add_markers=true&add_traffic=true&language=EN
domain/maps?location=XYZ&add_traffic=true&language=HE
domain/maps?location=XYZ&add_markers=true

等等,其中每个传递的参数都独立于其他参数。

这就是我现在使用的,但不是使用日期类型的正则表达式im。