虽然hugo创建的是静态网站, 所以不会连接像mysql这样的数据库来获取数据, 但在有些地方依然需要获取一些预先定义好的数据, hugo提供了一些方法来解决这些问题.

data目录

在data目录下创建json | yaml | toml 格式的文件. 通过 .Site.Data变量以MPA的方式访问这些数据. 也就是MAP的结构组织目录和文件名的. 具体的可以输出.Site.Data来查看

例如在data目录中存放了两个用户的信息:

1
2
data/users/jim.toml
data/users/tom.toml

文件的内容为:

1
2
3
4
5
6
name = "Jim"
age = 22
address = [
    "地址一",
    "地址二"
]

在模板中使用这些数据:

1
2
3
4
{{$users := .Site.Data.users}}
{{$user_jim := .Site.Data.users.jim}}
<div>jim.tom文件中的姓名: {{$user_jim.name}}</div>
<div>输出users目录下所有文件的内容: {{$users}}</div>

外源数据

hugo还可以通过getJSONgetCSV两个函数加载外部数据, 这两个函数是模板函数. 在外部数据加载完成以前, hugo会暂停渲染模板文件.

语法:

1
2
{{ $dataJ := getJSON "url" }}
{{ $dataC := getCSV "separator" "url" }}

带可变参数语法:

1
2
{{ $dataJ := getJSON "url prefix" "arg1" "arg2" "arg n" }}
{{ $dataC := getCSV  "separator" "url prefix" "arg1" "arg2" "arg n" }}

getCSV的第一个参数为分隔符.

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
  <table>
    <thead>
      <tr>
      <th>Name</th>
      <th>Position</th>
      <th>Salary</th>
      </tr>
    </thead>
    <tbody>
    {{ $url := "https://example.com/demo.csv" }}
    {{ $sep := "," }}
    {{ range $i, $r := getCSV $sep $url }}
      <tr>
        <td>{{ index $r 0 }}</td>
        <td>{{ index $r 1 }}</td>
        <td>{{ index $r 2 }}</td>
      </tr>
    {{ end }}
    </tbody>
  </table>

这些外部的csv或json文件加载到本地后, 会缓存在特定的目录$TMPDIR/hugo_cache/.
也可通过--cacheDir参数指定新的缓存目录.或者通过--ignoreCache来禁止缓存.