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

如何使用FastAPI和Swagger允许任意查询参数?

闻人宇定
2023-03-14

注意:这个问题与这里的问题不同,因为我需要它来处理Swagger。

给定一个 FastAPI GET endpoint,我想允许任意一组 URL 参数,同时保持 Swagger 支持。

我的用例是,我想支持一组类似JSON API的查询参数,例如:

/api/books/?include=author&sort=name,zip&sort[author]=-lname&fields=name,phone,street

方括号的使用阻止了我使用传统的类来建模查询参数,所以我直接使用请求对象来代替。但是,我想使用Swagger来测试endpoint。我找不到提供任意URL参数的方法。我很乐意将它们作为单个字符串输入。

人们可能会这样想:

def books(**params): 
    ....

这给出了一个curl语句:

api/books?params=sort%5Bone%5D%3Dtwo'

我真正想要的是:

api/books?sort&one%5D%3Dtwo'

共有1个答案

蒋典
2023-03-14

您可以使用可选字符串参数(book_params在下面的情况下)通过OpenAPI(Swagger UI)将查询参数作为单个字符串传递,例如,包括=作者

下面的示例还使用了这里描述的方法,以修复parse_qs将单个值解析为列表的部分(例如,“foo=bar”将解析为 用户在url中多次传递同一个键,即 'fo=2

您可以检查这个可选参数,即book_params是否为空,以决定是使用book_params(意味着请求通过Swagger发送)还是直接使用请求对象(意味着通过在浏览器的地址栏中键入URL发送请求,例如,http://127.0.0.1:8000/api/books?include=author

from fastapi import FastAPI, Request
from typing import Optional
from urllib.parse import parse_qs

app = FastAPI()

@app.get("/api/books")
def books(request: Request, book_params: Optional[str] = None):
    q_params = {}
    
    if book_params is not None:
        q_params = parse_qs(book_params, keep_blank_values=True)
    else:   
        q_params = parse_qs(request.url.query, keep_blank_values=True)
        
    d = dict((k, v if len(v)>1 else v[0]) 
                for k, v in q_params.items())

    return d

 类似资料:
  • 我有一个用Swagger描述的POSTendpoint,我希望这个endpoint也有查询参数。我们使用1.2 swagger格式是因为传统原因。我们使用3scale,它托管文档,您可以在他们的web UI中编辑您的swagger。然而,当我试图保存文档时,它给我以下错误。 < code>JSON规范不能在同一方法上有paramType='body '和param type = ' query '

  • 因此,我在Rails中的模型的ElasticSearch关注中有以下模块。 这是有效的,但是如何使每个bool查询(must、must_not、filter)接受或空参数呢? 假设我传递一个空的,它将获得所有文档。然后,当我传递一个空的参数时,它将返回所有大小。

  • 我正在编写一个Fast API服务器,它接受请求,检查用户是否被授权,如果成功,则将其重定向到另一个URL。 我需要携带URL参数,例如

  • 我有一个基本配置,如下所示 所以基本上它允许/通过身份验证,但其他一切都需要token。我如何让它也绕过Swagger?这使得开发变得困难,因为团队依赖于Swagger来查看API文档。

  • 我有一个这样的endpoint: 在这里,是向用户公布的关键字。但是和是任意参数。对于另一个资源,如,任意参数可以是。 在 openapi 规范中,我有 我正在使用代码生成插件 ,在服务器控制器中,我想捕获所有任意参数。如何扩展我的 openapi 规范以使参数超出。如果有一种方法可以在单个数组中获取所有查询参数,那也将有所帮助。

  • 我有一个功能正常的Rails 3应用程序,它使用has_many:通过关联,而不是,因为我将其重制为Rails 4应用程序,让我从Rails 4版本中的关联模型中保存id。 这两个版本的三个相关模型是相同的。 分类.rb Question.rb 类别.rb 在这两个应用程序中,类别id都像这样传递到创建操作中 在Rails 3应用程序中,当我创建一个新问题时,它会插入问题表,然后插入分类表 在ra