Go语言Beego框架介绍
一个使用 Go 的思维来帮助您构建并开发 Go 应用程序的开源框架
Beego简介
beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API、Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架,但是结合了 Go 本身的一些特性(interface、struct 嵌入等)而设计的一个框架。
Beego架构
beego 的整体设计架构如下所示:
Beego 的执行逻辑
Beego项目结构
1├── conf
2│ └── app.conf
3├── controllers
4│ ├── admin
5│ └── default.go
6├── main.go
7├── models
8│ └── models.go
9├── static
10│ ├── css
11│ ├── ico
12│ ├── img
13│ └── js
14└── views
15 ├── admin
16 └── index.tpl
从上面的目录结构我们可以看出来 M(models 目录)、V(views 目录)和 C(controllers 目录)的结构, main.go
是入口文件。
安装beego和bee工具
1go get -u github.com/astaxie/beego
2go get -u github.com/beego/bee
新建项目
使用bee工具可以很方便的创建一个项目
1bee new myapp
2______
3| ___ \
4| |_/ / ___ ___
5| ___ \ / _ \ / _ \
6| |_/ /| __/| __/
7\____/ \___| \___| v1.10.0
82020/03/16 13:03:02 WARN ▶ 0001 You current workdir is not inside $GOPATH/src.
92020/03/16 13:03:02 INFO ▶ 0002 Creating application...
10 create /Users/jerry/go/src/myapp/
11 create /Users/jerry/go/src/myapp/conf/
12 create /Users/jerry/go/src/myapp/controllers/
13 create /Users/jerry/go/src/myapp/models/
14 create /Users/jerry/go/src/myapp/routers/
15 create /Users/jerry/go/src/myapp/tests/
16 create /Users/jerry/go/src/myapp/static/
17 create /Users/jerry/go/src/myapp/static/js/
18 create /Users/jerry/go/src/myapp/static/css/
19 create /Users/jerry/go/src/myapp/static/img/
20 create /Users/jerry/go/src/myapp/views/
21 create /Users/jerry/go/src/myapp/conf/app.conf
22 create /Users/jerry/go/src/myapp/controllers/default.go
23 create /Users/jerry/go/src/myapp/views/index.tpl
24 create /Users/jerry/go/src/myapp/routers/router.go
25 create /Users/jerry/go/src/myapp/tests/default_test.go
26 create /Users/jerry/go/src/myapp/main.go
272020/03/16 13:03:02 SUCCESS ▶ 0003 New application successfully created!
执行上面的命令会在$GOPATH/src下创建myapp的web服务,如果是api服务则使用
1bee api myapi
2______
3| ___ \
4| |_/ / ___ ___
5| ___ \ / _ \ / _ \
6| |_/ /| __/| __/
7\____/ \___| \___| v1.10.0
82020/03/16 13:04:05 WARN ▶ 0001 You current workdir is not inside $GOPATH/src.
92020/03/16 13:04:05 INFO ▶ 0002 Creating API...
10 create /Users/jerry/go/src/myapi
11 create /Users/jerry/go/src/myapi/conf
12 create /Users/jerry/go/src/myapi/controllers
13 create /Users/jerry/go/src/myapi/tests
14 create /Users/jerry/go/src/myapi/conf/app.conf
15 create /Users/jerry/go/src/myapi/models
16 create /Users/jerry/go/src/myapi/routers/
17 create /Users/jerry/go/src/myapi/controllers/object.go
18 create /Users/jerry/go/src/myapi/controllers/user.go
19 create /Users/jerry/go/src/myapi/tests/default_test.go
20 create /Users/jerry/go/src/myapi/routers/router.go
21 create /Users/jerry/go/src/myapi/models/object.go
22 create /Users/jerry/go/src/myapi/models/user.go
23 create /Users/jerry/go/src/myapi/main.go
242020/03/16 13:04:05 SUCCESS ▶ 0003 New API successfully created!
快速启动
1cd $GOPATH/src/myapp
2go mod init
3bee run
4______
5| ___ \
6| |_/ / ___ ___
7| ___ \ / _ \ / _ \
8| |_/ /| __/| __/
9\____/ \___| \___| v1.10.0
102020/03/16 13:05:31 INFO ▶ 0001 Using 'myapp' as 'appname'
112020/03/16 13:05:31 INFO ▶ 0002 Initializing watcher...
12go: finding module for package github.com/astaxie/beego
13go: found github.com/astaxie/beego in github.com/astaxie/beego v1.12.1
14go: finding module for package github.com/shiena/ansicolor
15go: found github.com/shiena/ansicolor in github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644
162020/03/16 13:05:42 SUCCESS ▶ 0003 Built Successfully!
172020/03/16 13:05:42 INFO ▶ 0004 Restarting 'myapp'...
182020/03/16 13:05:42 SUCCESS ▶ 0005 './myapp' is running...
192020/03/16 13:05:43.906 [I] [asm_amd64.s:1373] http server Running on http://:8080
程序会自动下载依赖包,并监听8080端口
ORM
程序自带orm功能
1package main
2
3import (
4 "github.com/astaxie/beego/orm"
5 _ "github.com/go-sql-driver/mysql"
6)
7
8type User struct {
9 Id int
10 Name string
11 Age int
12}
13
14func init() {
15 // 注册驱动
16 orm.RegisterDriver("mysql", orm.DRMySQL)
17 // 连接数据库
18 orm.RegisterDataBase("default", "mysql", "root:root@tcp(127.0.0.1:3306)/orm_test?charset=utf8")
19 orm.RegisterModel(new(User))
20 // 自动建表
21 orm.RunSyncdb("default", false, true)
22}
23
RegisterDriver
支持3中数据库类型
1orm.DRMySQL
2orm.DRSqlite
3orm.DRPostgres
RegisterDataBase
ORM 必须注册一个别名为 default
的数据库,作为默认使用。
SetMaxIdleConns
根据数据库的别名,设置数据库的最大空闲连接
1orm.SetMaxIdleConns("default", 30)
SetMaxOpenConns
根据数据库的别名,设置数据库的最大数据库连接 (go >= 1.2)
1orm.SetMaxOpenConns("default", 30)
时区设置
ORM 默认使用 time.Local 本地时区
- 作用于 ORM 自动创建的时间
- 从数据库中取回的时间转换成 ORM 本地时间
如果需要的话,你也可以进行更改
1// 设置为 UTC 时间
2orm.DefaultTimeLoc = time.UTC
ORM 在进行 RegisterDataBase 的同时,会获取数据库使用的时区,然后在 time.Time 类型存取时做相应转换,以匹配时间系统,从而保证时间不会出错。
CURD
Create 新增
1o := orm.NewOrm()
2user := new(User)
3user.Name = "jerry"
4
5fmt.Println(o.Insert(user))
Read 查询
1o := orm.NewOrm()
2user := User{Id: 1}
3
4err := o.Read(&user)
5if err !=nil {
6 log.Println("查不到")
7}
Update 修改
1o := orm.NewOrm()
2user := User{Id: 1}
3
4user.Name = "Your"
5fmt.Println(o.Update(user))
Delete 删除
1o := orm.NewOrm()
2user := User{Id: 1}
3
4fmt.Println(o.Delete(user))
缓存模块
beego 的 cache 模块是用来做数据缓存的,设计思路来自于 database/sql
,目前支持 file、memcache、memory 和 redis 四种引擎,安装方式如下:
1go get github.com/astaxie/beego/cache
并且在使用的时候导入对应的驱动
1import _ "github.com/astaxie/beego/cache/memcache" # memcache
2import _ "github.com/astaxie/beego/cache/redis" # redis
其中redis的连接格式
1{"key":"collectionName","conn":"127.0.0.1:6379","dbNum":"0","password":"thePassWord"}
- key: Redis collection 的名称
- conn: Redis 连接信息
- dbNum: 连接 Redis 时的 DB 编号. 默认是0.
- password: 用于连接有密码的 Redis 服务器.
基本操作
1bm.Put("jerry", 1, 3600*time.Second)
2bm.Get("jerry")
3bm.IsExist("jerry")
4bm.Delete("jerry")
一些经常需要查询到但是又比较少变化的,通常使用缓存缓存起来,效率更高效并且缓解数据库的压力。
Session控制
开启session需要修改配置文件或者在main函数中修改
修改配置文件conf/app.conf
1sessionon = true
或者在main函数入口设置
1beego.BConfig.WebConfig.Session.SessionOn = true
session 有几个方便的方法:
- SetSession(name string, value interface{}) # 设置session
- GetSession(name string) interface{} # 获取session
- DelSession(name string) # 删除session
- SessionRegenerateID()
- DestroySession()
通常用在保存用户会话。
过滤器
beego 支持自定义过滤中间件,例如安全验证,强制跳转等。
过滤器函数如下所示:
1beego.InsertFilter(pattern string, position int, filter FilterFunc, params ...bool)
InsertFilter 函数的三个必填参数,一个可选参数
- pattern 路由规则,可以根据一定的规则进行路由,如果你全匹配可以用
*
- position 执行 Filter 的地方,五个固定参数如下,分别表示不同的执行过程
- BeforeStatic 静态地址之前
- BeforeRouter 寻找路由之前
- BeforeExec 找到路由之后,开始执行相应的 Controller 之前
- AfterExec 执行完 Controller 逻辑之后执行的过滤器
- FinishRouter 执行完逻辑之后执行的过滤器
- filter filter 函数 type FilterFunc func(*context.Context)
示例:验证用户是否已经登录,应用于全部的请求
1var FilterUser = func(ctx *context.Context) {
2 _, ok := ctx.Input.Session("uid").(int)
3 if !ok && ctx.Request.RequestURI != "/login" {
4 ctx.Redirect(302, "/login")
5 }
6}
7
8beego.InsertFilter("/*",beego.BeforeRouter,FilterUser)
以上介绍的都是一些比较常用的模块,更多详细的信息,可以上官网查看。
- 原文作者:黄忠德
- 原文链接:https://huangzhongde.cn/post/Golang/Go_Beego/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。