반응형
fastapi/flask/nodejs의 쿼리 매개 변수를 따르는 대괄호
중복 질문이라면 정말 죄송하지만 이 웹사이트를 제외하고는 거의 볼 수가 없습니다. 이 웹사이트는 원래 사람들이 REST API를 통해 구글 시트에서 쿼리를 작성할 수 있도록 도와줍니다. 링크는 다음과 같습니다.
spreadsheetID/sheetName?filter[ColumnName]=aiman
나는 단지 패스트에서 그것을 어떻게 하는지 궁금하다.특히 매개 변수에 대한 API입니다. 열 이름은 열 이름에 따른 변수이기도 합니다. 나는 이미 읽었지만 그것을 잘 이해할 수 없다. 어떤 언어라도 나는 좋아한다.
Fast에 내장된 것은 아무것도 없다.그것을 달성하기 위한 API, 그러나 우리는 그것을 작성할 수 있다! 매개 변수를 구문 분석하는 함수가 필요합니다.
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}
이제 그것을 사용할 때입니다, 가장 간단한 방법은 기본적인 스타렛 요청과 구문 분석 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))
만약 당신이 Fast를 원한다면API 마법, 다른 두 가지 옵션이 있습니다.
@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
두 번째 솔루션을 사용하면 특정 라우터에 대해서만 이러한 논리를 할당할 수 있습니다. 두 경우 모두 Fast의 도움을 받아 엔드포인트를 사용할 수 있습니다.지금 API 유효성 검사:
@app.get("/sheetName")
def endpoint(op: str, col: str, val: Any):
print(op, col, val)
이 접근 방식에는 한계가 있습니다(예: 더 많은 매개 변수가 있을 수 있는 경우?). 또는 대괄호가 있는 더 많은 매개변수?)와 정확한 솔루션은 특정 요구사항에 따라 다르지만, 이러한 요구사항을 해결하는 방법에 대한 충분한 통찰력을 제공해야 합니다.
간단한 방법은 별칭과 함께 종속성을 사용하는 것입니다.
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)
반응형
'개발하자' 카테고리의 다른 글
Kubernetes 조타 차트를 설치할 수 없습니다. 오류: 아직 사용 중인 이름을 재사용할 수 없습니다. (0) | 2022.12.17 |
---|---|
'DateTime' 유형이 Flower Cloud Firestore의 'String' 유형의 하위 유형이 아닙니다. (0) | 2022.12.16 |
다트 코드로만 플러터 웹 API 오류를 해결하는 방법은 무엇입니까? (0) | 2022.12.15 |
주피터 서버: 시작되지 않음, vs 코드에 커널 없음 (0) | 2022.12.14 |
목록 <String>을 플러터에서 int 유형으로 변환하는 방법 (0) | 2022.12.14 |