개발하자

fastapi/flask/nodejs의 쿼리 매개 변수를 따르는 대괄호

Cuire 2022. 12. 16. 02:47
반응형

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 마법, 다른 두 가지 옵션이 있습니다.

  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

두 번째 솔루션을 사용하면 특정 라우터에 대해서만 이러한 논리를 할당할 수 있습니다. 두 경우 모두 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)

반응형