개발하자

URL을 경로 매개 변수로 Fast에 전달하는 방법API 경로?

Cuire 2023. 4. 26. 16:21
반응형

URL을 경로 매개 변수로 Fast에 전달하는 방법API 경로?

FastAPI를 사용하여 간단한 API를 만들었고, URL을 Fast에 전달하려고 합니다.임의 매개 변수로 API 경로를 지정합니다.

from fastapi import FastAPI
app = FastAPI()
@app.post("/{path}")
def pred_image(path:str):
    print("path",path)
    return {'path':path}

테스트를 해보니 작동하지 않고 오류가 발생합니다. 다음과 같은 방법으로 테스트합니다.

http://127.0.0.1:8000/https://raw.githubusercontent.com/ultralytics/yolov5/master/data/images/zidane.jpg



옵션 1

변환기를 사용하여 임의 경로를 캡처할 수 있습니다. 에 따라 추가 문자를 포함한 나머지 경로를 반환합니다.

from fastapi import Request

@app.get('/{_:path}')
def pred_image(request: Request):
    return {"path": request.url.path[1:]}

또는

@app.get("/{full_path:path}")
def pred_image(full_path: str):
    return {"path": full_path}

다음을 사용합니다.

http://127.0.0.1:8000/https://raw.githubusercontent.com/ultralytics/yolov5/master/data/images/zidane.jpg

:

{"path":"https://raw.githubusercontent.com/ultralytics/yolov5/master/data/images/zidane.jpg"}

옵션 2

코멘트 섹션에서 언급한 @luk2302와 같이, 당신의 클라이언트(즉, 최종 사용자, 자바스크립트 등)는 URL을 인코딩해야 한다. 그러나 @luk2302에서 제공하는 인코딩된 URL이 작동하지 않는 것처럼 보여 오류가 발생합니다. 결과적으로, 작동하도록 인코딩해야 합니다. 즉:

http://127.0.0.1:8000/https%253A%252F%252Fraw.githubusercontent.com%252Fultralytics%252Fyolov5%252Fmaster%252Fdata%252Fimages%252Fzidane.jpg

서버 측에서는 다음과 같이 URL을 두 번 디코딩할 수 있습니다.

from urllib.parse import unquote 

@app.get("/{path}")
def pred_image(path: str):
    return {'path':unquote(unquote(path))}  

옵션 3

엔드포인트에서 요청을 수락하는 것처럼 보이므로 클라이언트가 이미지 URL을 경로 매개 변수로 전달하는 대신 요청 본문에 전송하도록 할 수 있습니다. 답변을 참조하십시오. 또한, 이를 수행하는 방법에 대한 답변을 참조하십시오.


참고:

브라우저의 주소 표시줄에 URL을 입력하여 이를 테스트하는 경우, 브라우저의 주소 표시줄에 URL을 입력하면 요청이 수행되므로 경로를 계속 사용하십시오. 그러나 요청 작업에 필요한 경우 엔드포인트의 장식자를 (질문에 표시된 대로) 로 변경해야 합니다. 그렇지 않으면 오류가 발생할 수 있습니다.




예:

이 전달된 URL에는 쿼리 매개 변수가 없습니다. 필요만 있습니다.

@app.get('/proxy/{url:path}')
async def proxy(url:str):
    # url:https://raw.githubusercontent.com/ultralytics/yolov5/master/data/images/zidane.jpg 
    return url  

와 일치할 수 있지만 에 중지되므로 전체 URL을 가져오려면 .contain full url을 포함하고 호스트를 포함해야 합니다. 예:

PS: 전달된 URL이 합법적인지 여부를 확인하는 데 사용됩니다.

from pydantic import HttpUrl  
from fastapi import FastAPI, Request  
  
app = FastAPI()  
  
  
# example request url http://127.0.0.1:8000/proxy/http://www.xx.com/abc?query=abc  
@app.get('/proxy/{url:path}', )  
async def proxy(url: HttpUrl, req: Request):  
    # url: http://www.xx.com/abc  
    # req.url: http://127.0.0.1:8000/porxy/http://www.xx.com/abc?query=abc    
    # wanted_url: http://www.xx.com/abc?query=abc  
    wanted_url = str(req.url).partition('/proxy/')[-1]  
    return {'url': url, 'req_url': str(req.url), 'wanted_url': wanted_url}  
  
  
if __name__ == '__main__':  
    import uvicorn  
    uvicorn.run('main:app', port=8000)

Path convertor https://fastapi.tiangolo.com/tutorial/path-params/#경로 선택기

Starlette에서 직접 옵션을 사용하여 다음과 같은 URL을 사용하여 을 포함하는 을 선언할 수 있습니다.

/files/{file_path:path}

이 경우 매개 변수의 이름은 이고 마지막 부분은 매개 변수가 임의와 일치해야 함을 나타냅니다.

따라서 다음과 같이 사용할 수 있습니다.

from fastapi import FastAPI  app = FastAPI()  
@app.get("/files/{file_path:path}") 
async def read_file(file_path: str):     
    return {"file_path": file_path}

:


반응형