如果這是一個重復的問題,我很抱歉,但除了這個網站之外,我幾乎看不到任何地方。該網站最初是幫助人們通過 REST API 在 Google Sheet 中進行查詢。他們的鏈接就像這個例子:
spreadsheetID/sheetName?filter[ColumnName]=aiman
我只是想知道如何在 FastAPI 中做到這一點,尤其是對于 params filter[columnName]。columnName 也是一個變數,它根據列的名稱。我已經讀過這個,但不能很好地理解它。我也欣賞任何語言。
uj5u.com熱心網友回復:
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 魔法,你還有另外兩個選擇
- 中間件
@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
- 定制要求
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)
這種方法有局限性(比如如果可以有更多引數呢?或者更多帶括號的引數會怎樣?)并且確切的解決方案取決于特定的需求,但它們應該讓您足夠了解如何解決這些問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/375546.html
