스택큐힙리스트

url_for()를 사용하여 FastAPI와 Jinja2를 사용하여 경로와 쿼리 데이터를 라우트로 전달하는 방법은 무엇인가요? 본문

카테고리 없음

url_for()를 사용하여 FastAPI와 Jinja2를 사용하여 경로와 쿼리 데이터를 라우트로 전달하는 방법은 무엇인가요?

스택큐힙리스트 2023. 11. 6. 07:51
반응형

저는 Jinja2 템플릿 내부에서 FastAPI 라우트를 호출하고 싶으며, 그 라우트에 pathquery 데이터 (매개변수)를 전달하고 싶습니다. 제가 시도한 방법은 다음과 같은 Jinja2 템플릿입니다:


{{ url_for('function1', uustr=data.uustr, interval=1) }}

다음은 호출하고 싶은 FastAPI 라우트입니다 (데모 목적으로 구문이 간소화되었습니다):


@app.get(/updates/data/{uustr},response_class=HTMLResponse)
async def function1(request: Request, uustr:str, interval:int):
return
<html>
<head>
<title>{{ uustr }}</title>
</head>
<body>
<h1>{{ interval }}</h1>
</body>
</html>


다음과 같은 오류가 발생합니다:


raise ValueError('context must include a request key') 
ValueError: context must include a request key

어떤 아이디어가 있으신가요?

답변 1

<!DOCTYPE html>
<html>
<body>
<h1>페이지 번호 {{ page_no }}</h1>
<h2>아이템 {{ item_id }}</h2>
<h3>{{ user }}</h3>
<h4>{{ msg }}</h4>
</body>
</html>

업데이트


이제 Starlette의 starlette.datastructures.URL을 사용할 수 있습니다. 이는 include_query_params 메소드를 제공합니다. 아래는 예시입니다:


app.py에서 URL 클래스를 import하고 Jinja2 템플릿에서 접근할 수 있도록 만듭니다:

from starlette.datastructures import URL
templates = Jinja2Templates(directory=templates)
templates.env.globals['URL'] = URL

templates/item.html에서 다음과 같이 사용하세요:


<!DOCTYPE html>
<html>
<body>
<div class=container>
<iframe src={{ URL(url_for('updates', page_no=5, item_id=3)).include_query_params(user='foo', msg='bar') }} width = 300 height = 300 style= border: none;></iframe>
</div>
</body>
</html>

답변 2

FastAPI 및 Jinja2를 사용하여 경로 및 쿼리 데이터를 라우트로 전달하는 방법에 대해 작성해 드리겠습니다. 이 글은 SEO에 신경을 쓴 한국어 에세이 형식으로 작성되었습니다.
FastAPI는 효율적인 웹 개발을 위한 빠른 Python 프레임워크입니다. Jinja2는 Python에서 작동하는 강력한 템플릿 엔진입니다. 두 개를 결합하여 웹 애플리케이션을 개발하는 것은 매우 효율적입니다. 여기서는 url_for() 함수를 사용하여 경로와 쿼리 데이터를 전달하는 방법을 알아보겠습니다.
url_for() 함수는 FastAPI에서 제공되는 헬퍼 함수입니다. 이 함수는 경로를 생성하고 쿼리 데이터를 인코딩하여 URL을 만드는 데 사용됩니다. Jinja2 템플릿에서 이 함수를 사용하여 동적인 링크를 생성할 수 있습니다. 예를 들어, 다음과 같은 경로와 쿼리 데이터를 가지고 있다고 가정해봅시다.
경로: /items/{item_id}
쿼리 데이터: ?keyword=fastapi
url_for() 함수를 사용하여 Jinja2 템플릿에서 이러한 경로와 쿼리 데이터를 전달하는 방법은 다음과 같습니다.
1. FastAPI 라우트에서 경로 및 쿼리 데이터를 url_for() 함수로 전달합니다. 예를 들어 다음과 같이 정의할 수 있습니다.
```python
from fastapi import FastAPI, Request
from fastapi.templating import Jinja2Templates
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse
from fastapi import url_for
app = FastAPI()
app.mount(/static, StaticFiles(directory=static), name=static)
templates = Jinja2Templates(directory=templates)
@app.route('/')
async def home(request: Request):
item_id = 123
keyword = fastapi
url = request.url_for('item_view', item_id=item_id, keyword=keyword)
return templates.TemplateResponse(index.html, {request: request, url: url})
@app.route('/items/{item_id}')
async def item_view(request: Request, item_id: int, keyword: str):
return HTMLResponse(content=

Item ID: {item_id}

Keyword: {keyword}

, status_code=200)
```
2. Jinja2 템플릿에서 URL을 사용하여 동적 링크를 생성합니다. 예를 들어, index.html 템플릿 파일에서 다음과 같이 사용할 수 있습니다.
```html



My Website


Welcome to My Website


Click Here


```
위의 예시에서는 FastAPI 앱에서 url_for() 함수를 이용하여 특정 경로와 쿼리 데이터를 생성하고, 이를 Jinja2 템플릿 파일에 전달한 후 링크를 생성합니다. 이렇게 생성된 링크를 클릭하면 해당 경로와 쿼리 데이터가 포함된 라우트로 이동하게 됩니다.
결론적으로, FastAPI와 Jinja2를 사용하여 경로와 쿼리 데이터를 전달하는 방법은 간단하고 효율적입니다. url_for() 함수를 사용하여 동적 링크를 생성하고 Jinja2 템플릿 파일에서 이를 사용하면 됩니다. 이러한 방법을 통해 SEO에 신경을 쓰며 웹 애플리케이션을 개발할 수 있습니다.

반응형
Comments