You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用Flask框架渲染.ejs格式的模板文件?

Flask 渲染 EJS 文件的实现方法

可以实现。Flask 默认内置 Jinja2 模板引擎,但通过第三方依赖扩展,完全可以和 Node.js + Express 一样使用 EJS 作为模板渲染引擎,原有 Node 项目里的 EJS 语法也可以通用。

方案1:使用 flask-ejs 扩展(推荐,和Express用法最接近)

步骤1:安装依赖

执行以下pip命令安装扩展包:

pip install flask-ejs

步骤2:初始化应用并配置EJS引擎

在Flask启动文件中引入并初始化扩展,默认会读取项目根目录下templates文件夹内的EJS模板,和Express的默认模板目录规则一致:

from flask import Flask
from flask_ejs import EjsExtension

app = Flask(__name__)
# 可自定义EJS模板存放目录,不配置默认使用templates文件夹
# app.config['EJS_TEMPLATES_DIR'] = 'your_custom_dir'
ejs = EjsExtension(app)

步骤3:渲染EJS模板

和Express中res.render的用法基本一致,直接调用ejs.render方法传入模板名和变量即可:

  1. 先在templates目录下新建index.ejs文件,语法和Node端EJS完全相同:
<h2>欢迎来到 <%= site_name %></h2>
<% if (is_login) { %>
  <p>当前登录用户:<%= username %></p>
  <ul>
    <% for(let item of nav_list) { %>
      <li><a href="<%= item.url %>"><%= item.name %></a></li>
    <% } %>
  </ul>
<% } else { %>
  <button>点击登录</button>
<% } %>
  1. 编写路由调用渲染方法:
@app.route('/')
def home():
    return ejs.render('index.ejs', 
        site_name = "Flask EJS 测试",
        is_login = True,
        username = "测试用户",
        nav_list = [
            {"name": "首页", "url": "/"},
            {"name": "设置", "url": "/settings"}
        ]
    )

方案2:手动封装渲染逻辑(无需Flask扩展)

如果不想引入额外的Flask扩展,也可以直接使用Python的EJS解析库自行封装渲染函数:

步骤1:安装依赖

pip install pyejs

步骤2:封装渲染函数

from flask import Flask, make_response
from pyejs import EJS
import os

app = Flask(__name__)
# 配置EJS模板存放目录
EJS_TEMPLATE_PATH = os.path.join(os.path.dirname(__file__), "templates")

def render_ejs(template_name: str, **context) -> str:
    template_full_path = os.path.join(EJS_TEMPLATE_PATH, template_name)
    with open(template_full_path, "r", encoding="utf-8") as f:
        ejs_content = f.read()
    rendered_html = EJS(ejs_content).render(context)
    response = make_response(rendered_html)
    response.headers["Content-Type"] = "text/html; charset=utf-8"
    return response

# 路由使用
@app.route('/')
def home():
    return render_ejs('index.ejs', name = "测试")

注意事项

  • 两种方案都完全兼容Node端EJS的所有语法,包括变量输出、条件判断、循环、模板嵌套、include语法等,原有Node项目的EJS模板可以直接迁移使用
  • 如果项目同时使用Jinja2和EJS,建议给两种模板设置不同的后缀名,避免模板加载冲突
  • 生产环境使用建议提前缓存EJS模板内容,减少重复IO读取和解析的性能消耗

内容的提问来源于stack exchange,提问作者Sumit Tyagi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:06:05