1、goland2017版本下载github.com/astaxie/beego之后无法使用,也没有在vendor目录。
通过go mod init / go mod vendor将第三方依赖库打包到vendor目录下面。
2、beego学习笔记
beego是一个快速开发go应用的HTTP框架,他可以用来快速开发API、Web及后端服务等各种应用,是一个RESTful的框架,设计灵感来源于tornado、sinatra和flask这三个框架,但是结合了Go本身的一些特性(interface、struct嵌入等)而设计的一个框架。
beego是基于八大独立的模块:cache、config、context、httplibs、logs、orm、session、toolbox构建的,是一个高度解耦的框架。
beego的执行逻辑
beego是一个典型的MVC架构,执行逻辑如下:
MVC的含义就是M(models目录)、V(views目录)和C(controllers目录)的结构,main.go是入口文件。
快速入门
项目路由设置
go的执行过程:main入口,首先执行子包,全局const var 定义,init(),再回到main包的const var定义,init(),接着执行main();
package routers
import (
"quickstart/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
}
路由包里面我们看到了执行路由注册beego.Router,这个函数的功能映射URL到controller,第一个参数是URL,第二个参数是对应的Controller,也就是我们即将把请求分发到那个控制器来执行相应的逻辑。
beego.Run表面上好像只是监听服务端端口,但是它内部做了很多事情:
1、解析配置文件
自动解析在conf目录下面的配置文件app.conf
2、执行用户的hookfunc
3、是否开启session
4、是否编译模板
5、是否开启文档功能
6、是否启动管理模块功能
7、监听服务端口
controller逻辑
type MainController struct {
beego.Controller
}
MainController自动拥有了所有beego.Controller的方法。beego.Controller拥有很多方法,其中包括Init、Prepare、Post、Get、Delete、Head等方法。可以重写其中的方法。
请求默认是执行对应req.Method的方法。例如浏览器的GET请求,那么默认就是执行MainController下的Get方法。这样我们上面的Get方法就会被执行到,这样就进入了我们的逻辑处理。
model分析
web应用用的最多的就是数据库操作,而model层一般用来做这些操作。逻辑里面存在着可以复用的东西,那么就抽取出来变成一个模快。因此Model就是逐步抽象的过程,一般我们会在Model里面处理一些数据读取。
View编写
在编写Controller的时候,在Get里面写过这样的语句this.TplName = "index.tpl",设置显示的模板文件,默认支持tpl和html的后缀名,如果想设置其他后缀你可以调用beego.AddTemplateExt接口设置,那么模板如何来显示相应的数据呢?beego采用了Go语言默认的模板引擎,所有和Go的模板语法一样。Go模板的详细使用方法请参考《Go Web编程》
在Controller里面把数据赋值给了Data(map类型),然后我们在模板中就直接通过key访问.Website和.Email。这样就做到了数据的输出。
静态文件处理
前面介绍了如何输出静态页面,但是我们的网页往往包含很多静态文件,如图片、JS、CSS,刚才创建的应用里面就有创建了如下目录/static/css /static/img /static/js
beego默认注册了static目录为静态处理的目录,注册样式:URL前缀和映射的目录
StaticDir["/static"] = "static"
用户可以设置多个静态文件处理目录,例如你有多个文件下载目录download1、download2,就可以这样映射(/main.go文件中beego.Run()之前加入):
beego.SetStaticPath("/down1", "download1")
beego.SetStaticPath("/down2", "download2")
这样用户访问URL http://localhost:8080/down1/123.txt则会请求download1目录下的123.txt文件
beego的MVC架构介绍
MVC执行逻辑流程1:
1、main文件监听端口8080
2、用户新链接
3、初始化context
4、执行过滤器(BeforeRouter)
5、静态文件处理
6、是否开启admin
7、是,监控统计URL
MVC执行流程2:
1、main文件监听端口8080
2、用户新链接
3、初始化context
4、执行过滤器(BeforeRouter)
5、执行过滤器(AfterStatic)
6、查找固定的路由
7、是否匹配,否,查找正则路由,否,查找自动化路由
8、执行Controller逻辑
9、执行过滤器(BeforeExec)
10、执行Controller的init函数
11、Enable XSRF 是,执行Controller的CheckXsrfCookie
12、否,执行Controller的prepare
13、执行Controller的逻辑函数(Get/Post等)
14、执行Controller的Render函数
15、执行Controller的Finish函数
16、执行过滤器AfterExec
17、执行Controller的Destructor函数
18、是否开启admin,是,监控统计URL
路由设置
前面介绍MVC执行时,beego存在三种方式的路由:固定路由、正则路由、自动路由
所有支持的基础函数如下所示:
- beego.Get(router, beego.FilterFunc)
- beego.Post(router, beego.FilterFunc)
- beego.Put(router, beego.FilterFunc)
- beego.Patch(router, beego.FilterFunc)
- beego.Head(router, beego.FilterFunc)
- beego.Options(router, beego.FilterFunc)
- beego.Delete(router, beego.FilterFunc)
- beego.Any(router, beego.FilterFunc)
RESTful Controller路由
固定路由
固定路由也就是全匹配的路由,如下:
beego.Router("/", &controllers.MainController{})
beego.Router("/admin", &admin.UserController{})
beego.Router("/admin/index", &admin.ArticleController{})
beego.Router("/admin/addpkg", &admin.AddController{})
上面是我们常用的路由方式,一个固定的路由,一个控制器,然后根据用户请求方法不同请求控制器中对应的方法,典型的RESTful方式
固定路由也就是全配置的路由,如下所示:
beego.Router("/", &controllers.MainController{})
beego.Router("/admin", &admin.UserController{})
beego.Router("/admin/index", &admin.ArticleController{})
beego.Router("/admin/addpkg", &admin.AddController{})
上图是最常用的路由方式,一个固定的路由,一个控制器,然后根据用户请求方法不同请求控制器对应的方法,典型的RESTful
方式。
正则路由
beego参考了sinatra的路由实现,支持多种方式的路由:
-
beego.Router(“/api/?:id”, &controllers.RController{})
默认匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”
-
beego.Router(“/api/:id”, &controllers.RController{})
默认匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”,但URL”/api/“匹配失败
-
beego.Router(“/api/:id([0-9]+)“, &controllers.RController{})
自定义正则匹配 //例如对于URL”/api/123”可以匹配成功,此时变量”:id”值为”123”
-
beego.Router(“/user/:username([\\w]+)“, &controllers.RController{})
正则字符串匹配 //例如对于URL”/user/astaxie”可以匹配成功,此时变量”:username”值为”astaxie”
可以在Controller中通过如下方式获取上面的变量
this.Ctx.Input.Param(":id")
this.Ctx.Input.Param(":username")
this.Ctx.Input.Param(":splat")
this.Ctx.Input.Param(":path")
this.Ctx.Input.Param(":ext")
自定义方法及RESTful规则
上面列举的是默认的请求方法名(请求的method和函数名一致,例如GET请求执行Get函数,POST函数执行Post函数),如果用户期望自定义韩树明,那么可以使用如下方式:
beego.Router("/",&IndexController{},"*:Index")
使用第三个参数,第三个参数就是用来设置对应method到函数名,定义如下:
*表示任意的method都执行该函数
使用httpmethod:funcname格式来展示
多个不同的格式使用;分割
多个method对应同一个funcname,method之间通过,来分割
以下是多个http Method指向同一个函数的示例:
beego.Router("/api",&RestController{},"get,post:ApiFunc")
以下是不同的method对应不同的函数,通过;进行分割的示例:
beego.Router("/simple",&SimpleController{},"get:GetFunc;post:PostFunc")
可用的HTTP Method
*:包含以下所有的函数
get:GET post:POST put:PUT delete:DELETE patch PATCH options:OPTIONS head:HEAD
同时存在*和对应的HTTP Method,那么优先执行HTTP Method的方法。
自动匹配