简介
Lua-testy-template 是一个基于OpenResty(一个强大的Nginx与Lua的集成)的轻量级模板引擎。它的设计目标是为了解决在Nginx环境中快速生成动态HTML页面的需求,提供简单、高效且灵活的模板处理能力。
Lua-testy-templat 采用了类似 ERB (Ruby) 或 EJS (JavaScript) 的标签语法,使得HTML代码与Lua逻辑相融合。这种设计允许开发者在不脱离HTML上下文的情况下进行数据处理和控制流操作。
应用场景
- Web服务后端渲染:在Nginx上直接处理HTTP请求,生成动态HTML,降低服务器负载。
- API Gateway:结合OpenResty的强大能力,可以用于构建复杂的API网关,将部分逻辑移至前端之前完成。
- 静态站点生成:虽然主要用于动态渲染,但在一些简化的场景下,也可以作为静态站点生成工具。
安装
代码语言:javascript复制这里通过OPM工具包安装,更多请查看OpenResty实战系列 | 包管理工具OPM和LuaRocks
#opm get bungle/lua-resty-template
* Fetching bungle/lua-resty-template
Downloading https://opm.openresty.org/api/pkg/tarball/bungle/lua-resty-template-2.0.opm.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 40890 100 40890 0 0 27987 0 0:00:01 0:00:01 --:--:-- 27987
Package bungle/lua-resty-template 2.0 installed successfully under /usr/local/openresty/site/ .
版本信息
代码语言:javascript复制# opm info bungle/lua-resty-template
Name : lua-resty-template
Version : 2.0
Abstract : Templating Engine (HTML) for Lua and OpenResty
Author : Aapo Talvensaari (@bungle)
Account : bungle
Code Repo : https://github.com/bungle/lua-resty-template
License : BSD 3-Clause "New" or "Revised" license
Original Work : yes
配置
代码语言:javascript复制默认模板文件存放路径在
ngx.var.document_root
路径。如果需要自定义,可以通过以下参数定义
template_root (set $template_root /var/www/site/templates)
template_location (set $template_location /templates)
如果在Nginx配置中没有这些设置,则使用ngx.var.document_root
的值。如果设置了template_location
,并且正常返回(状态码200),则使用其渲染。如果找不到,将回溯到template_root
或document_root
。
代码语言:javascript复制想知道
ngx.var.document_root
是什么,可以尝试打印看看
ngx.say(ngx.var.document_root)
ngx.say(ngx.var.template_root)
以上打印输出
代码语言:javascript复制/usr/local/openresty/nginx/html -- 默认
/usr/local/openresty/nginx/conf/lua/view -- 新配置路径
基础使用
使用 lua-resty-template 渲染一个简单html基本示例
hello_template.lua
文件
local template = require "resty.template" -- OR
-- local template = require "resty.template.safe" -- return nil, err on errors
-- Using template.new
local view = template.new "hello.html"
view.message = "Hello, World!"
view:render()
或者
代码语言:javascript复制local template = require "resty.template"
local view = template.new "hello.html"
view.message = "Hello, World!"
-- Using template.render
template.render("hello.html", { message = "Hello, World!" })
hello.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>开源技术小栈</title>
</head>
<body>
<h1>{{message}}</h1>
</body>
</html>
openresty.tinywan.com.conf
配置文件
server {
listen 80;
server_name openresty.tinywan.com;
set $template_root /usr/local/openresty/nginx/conf/lua/view;
location /resty_template {
default_type "text/html";
lua_code_cache off;
content_by_lua_file conf/lua/hello_template.lua;
}
}
请求访问
http://openresty.tinywan.com/resty_template
代码语言:javascript复制同样的事情也可以用
inline template string
来做
local template = require "resty.template" -- OR
local view = template.new "hello.html"
view.message = "Hello, World!"
template.render([[
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>开源技术小栈</title>
</head>
<body>
<h1>{{message}}</h1>
</body>
</html>]], { message = "Hello, 开源技术小栈!" })
模板语法
您可以在模板中使用以下标签
{{expression}}
,写入表达式的结果- html转义{*expression*}
,写入表达式的结果{% lua code %}
,执行Lua code{(template)}
,包含模板
文件,您也可以为包含文件{(file.html,{ message =“Hello,World”})}
提供上下文(注意:您不能在file.html
中使用逗号(,
),在这种情况下,请使用{[“file,with,comma”]}
代替){[expression]}
,包含表达式
文件(表达式的结果),您还可以为包含文件{[“file.html”,{ message =“Hello,World”} ]}
提供上下文{-block-}. {-block-}
,在{-block-}
内部包装为存储在具有键块的块表中的值(在本例中),请参见使用块。不要逐字
和原始地
使用预定义的块名。{-逐字-}... {-逐字-}
和{-原始-}. {-raw-}
是预定义的块,其内部不被lua-resty-template
处理,但内容按原样输出。{# comments #}``{#
和#}
之间的所有内容都被认为是注释掉的(即不输出或执行)
从模板中,您可以访问上下文
表中的所有内容,以及模板
表中的所有内容。在模板中,您还可以通过前缀键访问上下文
和模板
。
高级使用
代码语言:javascript复制local template = require "resty.template"
-- get var live_id
local live_id = ngx.var.live_id
-- 成员数组
members = { Tom = 2020, Jake = 2024, Dodo = 2028, Jhon = 2030 }
template.render("hello.html", {
title = "开源技术小栈",
live_id = live_id,
members = members
})
hello.html
渲染文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>开源技术小栈</title>
</head>
<body>
<h1>{{title}} {{live_id}}</h1>
<ul>
{% for value, name in pairs(members) do %}
<li>{{value}} == {{name}}</li>
{% end %}
</ul>
</body>
</html>
请求访问渲染:
http://openresty.tinywan.com/resty_template
更多:https://github.com/bungle/lua-resty-template