介绍Beego的结构模块。

1. Session

1.1 什么是session

Session的英文意思是会议,在Beego里面用于会话控制。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。

通常session实现机制都是在客户端放一个session ID (cookie),然后服务端存储一份session数据与之对应。服务端存储Session的位置可以自由决定,一般有:

  • 内存
  • cookie
  • 文件
  • mysql
  • redis

1.2 session的基本配置

beego默认不会开启session,所以要先打开,这一步一定要做。

sessionon = true

然后设置session id的名字,这个通常都是保存在客户端cookie里面。

sessionname = "beegosessionID"

此外我们还可以设置session的过期时间和session id(一般保存在cookie中)的过期时间(默认都是3600秒)

sessiongcmaxlifetime = 3600
SessionCookieLifeTime = 3600

1.3 session的例子

我们一个简单的控制器函数:

func (this *MainController) Get() {
    // 读取session数据
    v := this.GetSession("count")
    if v == nil {
        // 写入session数据
        this.SetSession("count", int(1))
        this.Data["num"] = 0
    } else {
        // 写入session数据
        this.SetSession("count", v.(int)+1)
        this.Data["num"] = v.(int)
    }
    this.TplName = "index.html"
}

其中.(int)只有对接口对象才能执行类型动态转换,在模板中写:

<body>
<h1>访问次数:</h1>
<p>
 {{ if .num}}
    已经访问了:{{.num}} 次!
{{else}}
    还没有访问!
{{end}}
</p>
</body>

只要我们访问localhost:8080/register,就会统计次数,每次刷新都会增加次数。

除此之外,session还有很多其他读写函数:

  • ·SetSession(name string, value interface{}) - 设置session值
  • GetSession(name string) interface{} - 读取session值
  • DelSession(name string) - 删除指定session值
  • SessionRegenerateID() - 生成新的session id
  • DestroySession() - 销毁session

1.4 配置session的存储引擎

前面提到的session引擎,默认是内存,这一节介绍其他的存储方法。

(1)文件存储

# 设置session保存到文件中
sessionprovider = "file"

# session数据保存目录
sessionproviderconfig = "./data/session"

(2)mysql存储

首先还是要mysql驱动,

go get github.com/astaxie/beego/session/redis

然后在main.go入口导入redis驱动:

import _ "github.com/astaxie/beego/session/redis"

然后

# 设置session存储引擎
sessionprovider = "mysql"

# mysql存储引擎配置
sessionproviderconfig = "root:123456@tcp(localhost:3306)/tizi365?charset=utf8"

mysql配置格式是:username:password@protocol(address)/dbname?param=value

(3)redis存储

将session数据保存到redis中,需要先安装redis驱动,然后在main.go文件中导入redis驱动。

配置:

# 设置session存储引擎
sessionprovider = "redis"

# redis存储引擎配置
# redis配置格式: redis地址,redis连接池最大连接数,redis密码
# redis连接池和redis密码配置,没有保持为空,例子:127.0.0.1:6379
sessionproviderconfig = "127.0.0.1:6379,1000,123456"

安装redis驱动:

go get github.com/astaxie/beego/session/redis

在main.go入口文件,导入redis驱动

import _ "github.com/astaxie/beego/session/redis"

2. 日志

前导工作:

go get github.com/astaxie/beego/logs //安装

import ( //导入
    "github.com/astaxie/beego/logs"
)

然后需要设置日志级别:

// debug级别
logs.SetLevel(logs.LevelDebug)

下面是常用的日志级别: 由高到底,高于当前日志级别的日志不展示。

  • LevelDebug - 对应数字 7
  • LevelInfo - 对应数字 6
  • LevelWarn - 对应数字 4
  • LevelError - 对应数字 3

然后是日志输出到文件的配置:

logs.SetLogger("file", `{"filename":"app.log", "level":6}`)

第二个参数是一个map,可以选用的配置有:

参数名 说明
filename 日志文件名
maxlines 每个文件保存的最大行数,默认值 1000000
maxsize 每个文件保存的最大尺寸,默认值是 1 << 28, //256 MB
daily 是否按照每天 logrotate,默认是 true
maxdays 文件最多保存多少天,默认保存 7 天
rotate 是否开启 logrotate,默认是 true
level 日志保存的时候的级别,默认是 Trace 级别
perm 日志文件权限

最后是调用不同的日志级别在文件中打印日志:

logs.Debug("这是一条debug日志, 后面是参数 ", 2019,2018)
logs.Info("携带参数1: %s, 参数2: %d", "tizi365", 2019)
logs.Warn("可以直接打印map类型数据 ", map[string]int{"key": 2019})
logs.Error("参数1", "参数2", "后面可以加入任意参数")

输出日志:

2019/06/30 18:38:23.075 [D] [main.go:29] tizi365 这是一条debug日志, 后面是参数  2019 2018
2019/06/30 18:38:23.149 [I] [main.go:29] tizi365 携带参数1: tizi365, 参数2: 2019
2019/06/30 18:38:23.149 [W] [main.go:29] tizi365 可以直接打印map类型数据  map[key:2019]
2019/06/30 18:38:23.149 [E] [main.go:29] tizi365 参数1 参数2 后面可以加入任意参数