fastapi/sflak/nodejs中查询参数的方括号



如果这是一个重复的问题,我很抱歉,但除了这个网站,我几乎没有在任何地方看到它。该网站最初帮助人们通过REST API在Google Sheet中进行查询。他们的链接如下所示:

spreadsheetID/sheetName?filter[ColumnName]=aiman

我只是想知道如何在FastAPI中做到这一点,尤其是对于paramsfilter〔columnName〕。columnName也是一个根据列名的变量。我已经读过了,但不能很好地理解它。任何语言我也很欣赏。

最简单的方法是使用带有别名的Query依赖项:

from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/sheetname")
def get_sheet(column_name: str = Query(default=None, alias="filter[ColumnName]"):
print(column_name)

FastAPI中没有任何东西可以实现这一点,但我们可以编写它!我们需要解析参数的函数:

import re
def parse_param(param, value):
regex = r"(?P<op>.*)[(?P<col>.*)]"
if m := re.search(r, param):
return {"op": m.group("op"), "col": m.group("col"), "val": value}
return {param: value}

现在是时候使用它了,最简单的方法是使用底层的Starlete请求并解析url

from fastapi import Request
@app.get("/sheetName")
def endpoint(r: Request):
k, v = next(iter(r.query_params.items())) # Assuming there is only one parameter
print(parse_param(k, v))

如果你想要一些FastAPI魔术,你有另外两个选项

  1. 中间件
@app.middleware("http")
async def preprocess(request: Request, call_next):
k, v = next(iter(request.query_params.items()))
request._query_params = QueryParams(parse_param(k, v))
request.scope["query_string"] = str(request._query_params).encode("ascii")
response = await call_next(request)
return response
  1. 自定义请求
from fastapi.routing import APIRoute
from starlette.datastructures import QueryParams
class BracketRequest(Request):
@property
def query_params(self):
k, v = next(iter(super().query_params.items()))
return QueryParams(parse_param(k, v))

class BracketRoute(APIRoute):
def get_route_handler(self):
original_route_handler = super().get_route_handler()
async def custom_route_handler(request: Request):
request = BracketRequest(request.scope, request.receive)
return await original_route_handler(request)
return custom_route_handler
app.router.route_class = BracketRoute

第二种解决方案允许您只为特定的路由器分配这样的逻辑。在这两种情况下,您现在都可以在FastAPI验证的帮助下使用端点:

@app.get("/sheetName")
def endpoint(op: str, col: str, val: Any):
print(op, col, val)

这种方法有局限性(比如如果可以有更多的参数?或者有更多带括号的参数?(,确切的解决方案取决于特定的需求,但它们应该让你有足够的洞察力来解决这些问题。