본문 바로가기

개발하자

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

반응형

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}

:


반응형