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}
:
'개발하자' 카테고리의 다른 글
Kubernetes 및 JVM 메모리 설정 (0) | 2023.04.27 |
---|---|
AKS(Azure Managed Kubernetes)에서 모든 컴퓨팅 중지 (0) | 2023.04.27 |
Conda env의 주피터 서버에서 러스트 커널에 연결할 수 없음 (0) | 2023.04.26 |
ModuleNotFoundError: 'fastapi'라는 이름의 모듈이 없습니다 (0) | 2023.04.25 |
파이썬 & 머신러닝(LSTM)을 이용한 향후 주가 'x'일 예측 (0) | 2023.04.24 |