文档章节

Lua Web快速开发指南(5) - 利用template库构建httpd模板引擎

水果糖的小铺子
 水果糖的小铺子
发布于 06/14 04:45
字数 1212
阅读 22
收藏 0
Lua

介绍template

模板引擎是为了使用户界面与业务数据(内容)分离而产生的, 其本身并不是一种深奥的技术.

template模板引擎首先会将合法的模板编译为lua函数, 然后将模板文件和数据通过模板引擎生成一份HTML代码.

cf的admin库整使使用了template来构建服务端渲染页面, 并利用单页面+iframe模式快速完成lua后台开发.

1. template基础语法

在真正使用之前, 我们先来学习一下template常见的一些基本语法:

  • {{ lua expression }} - lua expression是一段lua表达式; 作用为输出表达式的结果, 一些特殊符号将会被转义;

  • {* lua expression *} - lua expression是一段lua表达式; 作用为输出表达式的结果, 不会转义任何符号;

  • {% lua code %} - 执行一段lua代码, 如: {% for i = x, y do %} ... {% end %};

  • {# comments #}- comments仅作为注释, 不会包含在输出字符串内. 这段语法的作用类似lua内的----[[]];

  • {(template)} - 导入其它模板文件; 同时支持传参: {(file.html, { message = "Hello, World" })};

2. 转义字符

  • & 将会转义为 &
  • < 将会转义为 &lt;
  • > 将会转义为 &gt;
  • " 将会转义为 &quot;
  • ' 将会转义为 &#39;
  • / 将会转义为 &#47;

3. API

  • template.compile(html)

    参数html为字符串类型, 可以是:模板文件路径、

    此方法返回一个渲染函数, 调用这个函数并传入一个table(key-value)作为参数则可以在模板文件内直接引用.

  • template.precompile(view, path, strip)

    此方法用来将view预编译为lua的二进制代码块, strip是一个bool类型用来确定是否包含调试信息.

  • template.load(path)

    此方法用来重写template内部的加载行为; 默认的模板加载流程为: 检查缓存 -> 读取文件 -> 解析文件 -> 渲染 -> 输出;

    path字段为需要加载的文件路径或模板、html代码;

  • template.print(html)

    此方法用来重写template内部渲染后的输出行为; 默认的输出行为: print

  • template.caching(Enable)

    此方法用来告诉template是否缓存; 默认为true.

开始使用

现在尝试使用模板引擎完成一个静态页面的数据导入工作渲染一个页面并展示给用户看.

首先, 导入template库local template = require "template". 并且将目前我们熟知的编程语言名称都罗列出来.

local languages = { 'C', 'C++', 'Java', 'golang', 'Rust', 'Ruby', 'Python', 'perl', 'Lua' }

然后, 我们在app目录下新建一个view目录, 并在view目录下新建一个名字为base.html的文件。 内容如下:

<html>
  <head>
    <title>{*title*}</title>
  </head>
  <body>
    <span><b>{*title*}:</b></span>
    <ul>
      {% if type(languages) == 'table' then %}
        {% for index, lang in ipairs(languages) do %}
          <li>{*index..'. '..lang*}</li>
        {% end %}
      {% end %}
    </ul>
    {# 没错, 注释不会展示给用户看到! #}
  </body>
</html>

最后完成一个/languages的路由注册, 将我们刚刚完成的模板渲染出来.

local template = require "template"
app:use('/languages', function(content)
  template.cache = {}
	local languages = { 'C', 'C++', 'Java', 'golang', 'Rust', 'Ruby', 'Python', 'perl', 'Lua' }
  return template.compile("view/base.html"){
		title = '语言列表',
    languages = languages
  }
end)

template.cache = {}的意思是, 每次都重新刷新缓存去读取文件, 这样方便我们进行调试.

最后打开http://localhost:8080/languages查看效果.

将一个模板分解到多个文件中

当一个项目的业务需求变得非常多的时候, 即是一个单纯的模板页面也会变得非常庞大并且不容维护与阅读.

现在我们来尝试将上面的模板进行模块化.

首先, 我们继续在app目录新建head.htmlcontent.html. 然后将这些代码拷贝进去:

{# 这是head.html的内容 #}
<title>{*title*}</title>
{# 这是content.html的内容 #}
<span><b>{*title*}:</b></span>
<ul>
  {% if type(languages) == 'table' then %}
    {% for index, lang in ipairs(languages) do %}
      <li>{*index..'. '..lang*}</li>
    {% end %}
  {% end %}
</ul>
{# 没错, 注释不会展示给用户看到! #}

然后将原来的base.html修改为:

<html>
  <head>
    {(view/head.html)}
  </head>
  <body>
    {(view/content.html)}
  </body>
</html>

最后, 由于服务器会自动刷新模板缓存, 我们只需要再次刷新浏览器就能查看效果.

完整代码示例

-- main.lua
local httpd = require "httpd"
local app = httpd:new("app")

local template = require "template"
app:use('/languages', function(content)
	local languages = { 'C', 'C++', 'Java', 'golang', 'Rust', 'Ruby', 'Python', 'perl', 'Lua' }
	template.cache = {}
  return template.compile("view/base.html"){
		title = '语言列表',
    languages = languages
  }
end)

app:listen("0.0.0.0", 8080)

app:run()

更多

更多template用法可以参考cf的admin库.

继续学习

下一章我们继续学习如何使用缓存与数据库.

© 著作权归作者所有

水果糖的小铺子
粉丝 23
博文 153
码字总数 73315
作品 1
广州
程序员
私信 提问
Lua Web快速开发指南(4) - 详细了解httpd库的作用

httpd库是基于HTTP 1.1协议实现而来, 内置了高性能的http协议解析器与urldecode解析库. httpd库默认情况下就能工作的很好, 但是在一些需求较为极端的场景还是需要微调一下参数. httpd常用的内...

水果糖的小铺子
06/14
5
0
Lua Web快速开发指南(1) - 初识cf框架

cf是什么? cf全称为: CoreFramework. 一个基于Reactor事件驱动与协程的lua高性能网络框架, 目前主要面向HTTP Application开发. cf内部主要实现了包括HTTP与HTTP Over Websoket协议的Server,...

水果糖的小铺子
06/14
137
0
Kelly/KSFramework

KEngine + SLua|XLua|ILRuntime+ Framework = KSFramework KSFramework是一个整合KEngine、SLua(或XLua、ILRuntime)的Unity 5 Asset Bundle开发框架,并为程序、美术、策划、运营提供辅助工具...

Kelly
2016/06/29
0
0
五章 常用Lua开发库3-模板渲染

五章 常用Lua开发库3-模板渲染 博客分类: 跟我学Nginx+Lua开发 nginxlua 动态web网页开发是Web开发中一个常见的场景,比如像京东商品详情页,其页面逻辑是非常复杂的,需要使用模板技术来实...

epiclight
2015/06/07
243
0
Lua Web快速开发指南(3) - 初识httpd库路由

本章假设您已经知道httpd server如何快速搭建, 并且知道cf的启动流程与运行流程, 知晓httpd如何创建与启动. 回顾上一章节 我们利用httpd内置库快速实现了一套httpd静态文件server, 其中包括静...

水果糖的小铺子
06/14
22
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周四乱弹 —— 干啥啥不行,吃饭第一名。

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 : 李白到杜甫家吃饭。杜甫洗菜,发现只有青瓜和萝卜,心中愧疚。这时,他看见了邻居家的鸡,杜甫一时心酸,忍不住喃喃自语:我希望...

小小编辑
32分钟前
261
7
Java描述设计模式(08):桥接模式

本文源码:GitHub·点这里 || GitEE·点这里 一、桥接模式简介 1、基础描述 桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是“将抽象化...

知了一笑
32分钟前
6
0
C++ 函数指针的用法

天王盖地虎626
46分钟前
3
0
白话比原链跨链技术

随着Bystack的主侧链架构的推出,主侧链之间的跨链问题也成为比原链团队的主要攻克工程难题,当前比原链已经推出了两种跨链的机制,各有不同的侧重点,可能因为本身的跨链技术比较晦涩,本篇...

比原链Bytom
54分钟前
4
0
PostgreSQL参数search_path影响及作用

search_path稍微熟悉PG就会用到,用法这里就不必讲,本篇主要讲它在程序里怎样处理。 1、GUC参数定义 这是个 config_string 参数 {{"search_path", PGC_USERSET, CLIENT_CONN_STATEMENT,...

有理想的猪
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部