
Rust로 구현한 chameleon-rs는 기존 Chameleon 템플릿과 코드를 바꾸지 않고 실행하면서 비동기 렌더링과 자유 스레드 Python 지원을 더한다. 제작자는 자신의 웹 앱에서 이를 적용한 뒤 사이트 전체의 중앙값 응답 시간이 약 20% 줄었다고 밝혔다.
chameleon-rs 문서에 따르면 이 구현은 기존 Chameleon과 바이트 단위로 같은 출력을 내도록 설계됐다. Flask/Quart, FastAPI, Starlette, Robyn, Litestar 통합을 제공하며 부분 템플릿과 Markdown 기능도 포함한다. 런타임 의존성은 없다.
Chameleon으로 작성한 코드를 그대로 쓰려면 앱 진입점에서 Chameleon을 가져오기 전에 호환성 별칭을 설치하면 된다. 또는 chameleon_rs에서 기존 공개 API를 가져오도록 코드를 바꿀 수 있다.
import chameleon_rs.compat
chameleon_rs.compat.install()
# Before
from chameleon import PageTemplate, PageTemplateFile, PageTemplateLoader
import chameleon_partials
import chameleon_flask
# After
from chameleon_rs import PageTemplate, PageTemplateFile, PageTemplateLoader
import chameleon_rs.partials as chameleon_partials
import chameleon_rs.flask as chameleon_flask
제작자는 템플릿을 Rust 네이티브 프로그램으로 컴파일해 실행하기 때문에 반복문, 조건문, 이스케이프, 매크로와 슬롯 호출, 부분 템플릿, 출력 조립에는 Python 바이트코드를 사용하지 않는다고 설명한다. 템플릿이 사용자 코드의 속성이나 메서드, 헬퍼를 호출할 때는 Python이 실행된다. 제작자가 자신의 웹 앱에서 측정한 약 20% 감소는 템플릿 렌더링 속도만이 아니라 인증, 데이터베이스 작업, 로깅, 전자상거래 처리를 포함한 앱 전체의 응답 시간에 관한 결과다. 합성 벤치마크는 성능 안내에서 볼 수 있다.
부분 템플릿은 다른 템플릿 안에서 별도의 작은 모델로 렌더링하는 템플릿 파일이다. 카드나 폼 필드처럼 반복해서 쓰는 조각에 활용할 수 있으며, render_partial을 호출해 사용한다. Markdown 변환은 선택 기능으로, configure()로 켠 뒤 새 템플릿에서 markdown: 표현식을 사용한다. 변환기인 comrak은 chameleon-rs에 포함돼 있어 별도 Markdown 패키지를 설치하지 않아도 된다. 제작자는 동일한 확장 기능을 적용한 mistune보다 약 26배 빠르다고 밝혔다(Markdown 안내).
비동기 웹 앱에서는 동기 렌더링이 끝날 때까지 이벤트 루프의 다른 작업이 실행되지 않을 수 있다. chameleon-rs는 기존 render()를 유지하면서 render_async()를 추가했다. 프레임워크 통합에서는 @template으로 장식한 async def 뷰가 비동기 렌더링을 사용한다. 자세한 내용은 비동기 렌더링 안내를 참고할 수 있다.
자유 스레드 Python 환경에서 스레드 안전성을 갖도록 설계했다고 제작자는 설명한다. 기존 Chameleon 패키지는 저장소 기준 Python 3.13까지만 지원하고 빌드에 실패한다고 지적한다. Python 3.14에서는 자유 스레드 Python을 공식 지원하며, 3.15에서도 관련 변화가 이어지고 있다.
전환 전에 시험하려면 섀도 모드를 사용할 수 있다. 이 모드는 실제 요청 일부를 기존 Chameleon과 chameleon-rs 양쪽에서 렌더링해 차이를 보고하며, 비교 중에도 기존 Chameleon이 응답을 제공한다. 제작자는 샘플 요청의 출력이 같은지 확인할 수 있고 사용자는 차이를 보지 않는다고 설명한다. 자세한 내용은 섀도 모드 안내에 있다.
부록: 원문 예시
<div tal:repeat="video videos"> ${render_partial('shared/partials/video_card.pt', video=video, show_date=True)} </div>
import chameleon_rs from chameleon_rs import PageTemplate chameleon_rs.configure(markdown=True) page = PageTemplate('<article>${markdown: notes}</article>') print(page(notes='# Show notes\n\nWe talked about **templates** and
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요