반응형
FastAPI 엔드포인트 내의 동적 URL로 리디렉션하는 방법은 무엇입니까?
나는 프로필 페이지의 사용자가 (사용자 모델과 관련이 없는) 변경을 하는 기능을 하고 있다. 모든 것은 정적 템플릿을 통해 구현됩니다. 나는 사용자가 버튼을 클릭하고 요청을 처리한 후 동일한 페이지(즉, 그들의 프로필 페이지)로 돌아가기를 원한다.
HTML 템플릿
<td><a href="{{ url_for('decline_event_invite', pk=invite.id) }}" class="btn blue lighten-2">Accept</a></td>
엔드포인트.파이의
@router.get('/invite/{pk}/decline')
async def decline_event_invite(
request: Request,
pk: int,
user_id: str = Depends(get_current_user),
service: InviteService = Depends(),
):
await service.invite_decline(pk)
...
--> here I want redirect to user profile page
return RedirectResponse('DYNAMIC URL WITH ARGS')
옆모습을 보다.파이의
@router.get('/{pk}')
async def user_profile(
request: Request,
pk: int,
service: UserService = Depends()
):
user = await service.get_user_info(pk)
events_invites = await service.get_user_events_invite_list(pk)
return templates.TemplateResponse(
'profile.html',
context=
{
'request': request,
'user': user,
'events_invites': events_invites,
}
)
하지만 템플릿에 적용되는 논리와 유사한 방법을 찾을 수 없습니다. 예:
<a href="{{ url_for('user_profile', pk=pk) }}">Sender</a>
함수를 사용하고 () 경로 파라미터를 전달할 수 있습니다.
import uvicorn
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from fastapi.responses import RedirectResponse
import urllib
from fastapi import APIRouter
router = APIRouter()
templates = Jinja2Templates(directory="templates")
@router.get('/invite/{pk}/decline')
def decline_event_invite(request: Request, pk: int):
redirect_url = request.url_for('user_profile', **{ 'pk' : pk})
return RedirectResponse(redirect_url)
@router.get('/{pk}')
def user_profile(request: Request, pk: int):
return templates.TemplateResponse("profile.html", {"request": request, "pk": pk})
if __name__ == "__main__":
uvicorn.run(router, host='127.0.0.1', port=8000, debug=True)
조회 매개 변수를 추가하려면
쿼리 매개 변수도 전달해야 하는 경우 다음 코드를 사용할 수 있습니다. 또는 에 설명된 대로 를 사용할 수 있습니다(거의 동일한 접근 방식을 따릅니다).
엔드포인트에 다음과 같은 쿼리 매개 변수가 필요한 경우:
@router.get('/invite/{pk}/decline')
def decline_event_invite(request: Request, pk: int, message: str):
pass
다음을 사용할 수 있습니다:
redirect_url = request.url_for('user_profile', pk=pk)
parsed = list(urllib.parse.urlparse(redirect_url))
parsed[4] = urllib.parse.urlencode({**{ 'message' : "Success!"}})
redirect_url = urllib.parse.urlunparse(parsed)
또는 다음을 사용:
message = 'Success!'
redirect_url = request.url_for('user_profile', pk=pk) + f'?message={message}'
갱신하다
또 다른 해결책은 Starlette의 방법을 사용하는 것이다. 예:
from starlette.datastructures import URL
redirect_url = URL(request.url_for('user_profile', pk=pk)).include_query_params(message="Success!")
반응형
'개발하자' 카테고리의 다른 글
Python 3에서 edf 데이터를 읽는 방법 (0) | 2023.07.17 |
---|---|
VS 코드 주피터: 파이썬 대화형 창을 기본 콘솔로 작동시킬 수 있는 방법이 있나요? (0) | 2023.07.16 |
display_html 함수가 Jupyter Lab에서 작동하지 않습니다 (0) | 2023.07.15 |
"terraform apply"에서 도커 서버 ping 오류 발생 (0) | 2023.07.15 |
VScode가 주피터 노트북을 HTML로 내보내지 못함 - 'jupitter-nbconvert'를 찾을 수 없음 (0) | 2023.07.14 |