스택큐힙리스트

FastAPI/Starlette를 사용하여 경로의 이름을 어떻게 가져올까요? 본문

카테고리 없음

FastAPI/Starlette를 사용하여 경로의 이름을 어떻게 가져올까요?

스택큐힙리스트 2024. 1. 27. 12:49
반응형

 {'type': 'http', 'asgi': {'version': '3.0', 'spec_version': '2.3'}, 'http_version': '1.1', 'server': ('127.0.0.1', 8001), 'client': ('127.0.0.1', 56670), 'scheme': 'http', 'root_path': '', 'headers': [(b'user-agent', b'PostmanRuntime/7.29.2'), (b'accept', b'*/*'), (b'postman-token', b'f2da2d0f-e721-44c8-b14f-e19750ea8a68'), (b'host', b'localhost:8001'), (b'accept-encoding', b'gzip, deflate, br'), (b'connection', b'keep-alive')], 'method': 'GET', 'path': '/health', 'raw_path': b'/health', 'query_string': b'', 'app': <fastapi.applications.FastAPI object at 0x1036d5790>} 

업데이트 2: request.scope[route]가 깨지는 경우 미들웨어 코드를 제공합니다.

from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware(http)
async def logging_middleware(request: Request, call_next):
print(request.scope['route'].name)
response = await call_next(request)
return response
@app.get('/', name='abc')
def get_name(request: Request):
return request.scope['route'].name

from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware(http)
async def logging_middleware(request: Request, call_next):
print(request.scope['route'].name)
response = await call_next(request)
return response
@app.get('/', name='abc')
def get_name(request: Request):
return request.scope['route'].name

답변 1

미들웨어 대신에 APIRoute 클래스를 생성할 수도 있습니다. 이는 request를 처리하고 response를 받기 전에 route의 name을 가져올 수 있게 해주는 역할을 합니다 (앱에 요구 사항인 경우). 이렇게 하려면 APIRoute 클래스가 처리되기를 원하는 엔드포인트를 @app 대신에 @<name_of_router_instance>을 사용하여 추가할 수 있습니다. 예를 들면, @router.get('/', name='abc')과 같은 방식입니다. 여러 개의 엔드포인트도 같은 방법으로 추가할 수 있습니다. 예시:

from fastapi import APIRouter, FastAPI, Request, Response
from typing import Callable
from fastapi.routing import APIRoute
class CheckNameRoute(APIRoute):
def get_route_handler(self) -> Callable:
original_route_handler = super().get_route_handler()
async def custom_route_handler(request: Request) -> Response:
print(request.scope['route'].name)
response = await original_route_handler(request)
return response
return custom_route_handler
app = FastAPI()
router = APIRouter(route_class=CheckNameRoute)

@router.get('/', name='abc')
def get_name(request: Request):
return request.scope['route'].name

app.include_router(router)

from fastapi import APIRouter, FastAPI, Request, Response
from typing import Callable
from fastapi.routing import APIRoute
class CheckNameRoute(APIRoute):
def get_route_handler(self) -> Callable:
original_route_handler = super().get_route_handler()
async def custom_route_handler(request: Request) -> Response:
print(request.scope['route'].name)
response = await original_route_handler(request)
return response
return custom_route_handler
app = FastAPI()
router = APIRouter(route_class=CheckNameRoute)

@router.get('/', name='abc')
def get_name(request: Request):
return request.scope['route'].name

app.include_router(router)

답변 2

FastAPI와 Starlette을 사용하여 경로의 이름을 어떻게 가져올 수 있는지 알아보겠습니다. 경로의 이름을 가져오는 것은 웹 애플리케이션의 검색 엔진 최적화(SEO)를 위해 매우 중요합니다. SEO는 검색 엔진에서 웹 사이트를 더 잘 찾을 수 있도록 하는 프로세스입니다. 경로의 이름은 웹 사이트 구조를 이해하는 데 도움이 되며, 검색 엔진 알고리즘이 페이지의 핵심 내용을 더 쉽게 식별할 수 있습니다.
FastAPI와 Starlette은 파이썬 기반의 가벼운 웹 프레임워크로, 경로를 관리하고 핸들러 함수에 연결하는 데 사용됩니다. 기본적으로 경로는 URL 패턴을 기반으로 할당됩니다. 경로에 대한 이름은 FastAPI/Starlette을 사용하여 어렵지 않게 가져올 수 있습니다.
FastAPI/Starlette는 `name` 매개변수를 사용하여 경로에 이름을 할당하는 기능을 제공합니다. 이 기능을 사용하면 경로마다 고유한 이름을 지정할 수 있습니다. 아래는 예시 코드입니다.
```python
from fastapi import FastAPI
app = FastAPI()
@app.get(/users/{user_id}, name=user-details)
async def get_user(user_id: int):
return {user_id: user_id}
```
위의 코드에서 `name` 매개변수에 user-details라는 이름을 할당하였습니다. 이제 FastAPI/Starlette는 이 경로를 고유한 이름과 연결합니다. 경로의 이름은 SEO에 도움이 되는 URL을 생성하는 데 사용될 수 있습니다.
예를 들어, /users/42와 같은 URL은 검색 엔진에 대한 정보를 전달하기 어렵습니다. 하지만 /user-details와 같은 URL은 페이지 내용을 더 명확하게 식별할 수 있습니다. 검색 엔진 알고리즘은 경로의 이름을 사용하여 페이지의 주제를 이해하고, 검색 결과에 나타나는 데 도움을 줍니다.
경로의 이름을 통해 웹 사이트 구조를 명확히 전달하고, 검색 엔진이 페이지를 더 잘 식별하도록 하는 FastAPI/Starlette의 훌륭한 기능을 알아보았습니다. 경로의 이름을 설정함으로써 웹 사이트의 SEO를 향상시킬 수 있으며, 사용자에게 더 나은 검색 경험을 제공할 수 있습니다.

반응형
Comments