@ -1,4 +1,5 @@
# 快速入门
你对beego一无所知? 没关系, 这篇文档会很好的详细介绍beego的各个方面, 看这个文档之前首先确认你已经安装了beego, 如果你没有安装的话, 请看这篇[安装指南 ](Install.md )
**导航**
@ -23,11 +24,13 @@
- [第三方应用集成 ](#-19 )
- [部署编译应用 ](#-20 )
## 最小应用
一个最小最简单的应用如下代码所示:
package main
import (
"github.com/astaxie/beego"
)
@ -59,7 +62,7 @@
2、定义Controller, 这里我们定义了一个struct为`MainController` , 充分利用了Go语言的组合的概念, 匿名包含了`beego.Controller` ,这样我们的`MainController` 就拥有了`beego.Controller` 的所有方法。
3、定义RESTFul方法, 通过匿名组合之后, 其实目前的`MainController` 已经拥有了`Get` 、`Post` 、`Delete` 、`Put` 等方法, 这些方法是分别用来对应用户请求的Method函数, 如果用户发起的是`POST` 请求,那么就执行`Post` 函数。所以这里我们定义了`MainController` 的`Get` 方法用来重写继承的`Get` 函数,这样当用户`GET` 请求的时候就会执行该函数。
4、定义main函数, 所有的Go应用程序和C语言一样都是Main函数作为入口, 所以我们这里定义了我们应用的入口。
5、Router注册路由, 路由就是告诉beego, 当用户来请求的时候, 该如何去调用相应的Controller, 这里我们注册了请求`/` 的时候,请求到`MainController` 。这里我们需要知道, Router函数的两个参数函数, 第一个是路径, 第二个是Controller的指针。
@ -68,12 +71,13 @@
停止服务的话,请按`ctrl+c`
## 新建项目
通过如下命令创建beego项目, 首先进入gopath目录
bee create hello
这样就建立了一个项目hello, 目录结构如下所示
.
@ -90,10 +94,11 @@
└── views
└── index.tpl
## 开发模式
通过bee创建的项目, beego默认情况下是开发模式。
我们可以通过如下的方式改变我们的模式:
beego.RunMode = "pro"
@ -115,6 +120,7 @@

## 路由设置
路由的主要功能是实现从请求地址到实现方法, beego中封装了`Controller` ,所以路由是从路径到`ControllerInterface` 的过程,`ControllerInterface` 的方法有如下:
@ -144,40 +150,42 @@
为了用户更加方便的路由设置, beego参考了sinatra的路由实现, 支持多种方式的路由:
- beego.Router("/api/:id([0-9]+)", & controllers.RController{})
自定义正则匹配 //匹配 /api/123 :id= 123
- beego.Router("/api/:id([0-9]+)", & controllers.RController{})
自定义正则匹配 //匹配 /api/123 :id= 123
- beego.Router("/news/:all", & controllers.RController{})
- beego.Router("/news/:all", & controllers.RController{})
全匹配方式 //匹配 /news/path/to/123.html :all= path/to/123.html
- beego.Router(\`/user/:username([\w]+)\`, & controllers.RController{})
- beego.Router(\`/user/:username([\w]+)\`, & controllers.RController{})
正则字符串匹配 //匹配 /user/astaxie :username = astaxie
- beego.Router("/download/*.*", & controllers.RController{})
- beego.Router("/download/*.*", & controllers.RController{})
*匹配方式 //匹配 /download/file/api.xml :path= file/api :ext=xml
- beego.Router("/download/ceshi/*", & controllers.RController{})
*全匹配方式 //匹配 /download/ceshi/file/api.json :splat=file/api.json
- beego.Router("/:id:int", & controllers.RController{})
int类型设置方式 //匹配 :id为int类型, 框架帮你实现了正则([0-9]+)
- beego.Router("/:hi:string", & controllers.RController{})
string类型设置方式 //匹配 :hi为string类型。框架帮你实现了正则([\w]+)
如何在Controller中获取, 上面的变量可以通过如下方式获取
this.Ctx.Params[":id"]
this.Ctx.Params[":username"]
this.Ctx.Params[":splat"]
this.Ctx.Params[":path"]
this.Ctx.Params[":ext"]
this.Ctx.Params[":id"]
this.Ctx.Params[":username"]
this.Ctx.Params[":splat"]
this.Ctx.Params[":path"]
this.Ctx.Params[":ext"]
## 静态文件
Go语言内部其实已经提供了`http.ServeFile` , 通过这个函数可以实现静态文件的服务。beego针对这个功能进行了一层封装, 通过下面的方式进行静态文件注册:
beego.SetStaticPath("/static","public")
- 第一个参数是路径, url路径信息
- 第二个参数是静态文件目录(相对应用所在的目录)
@ -189,37 +197,41 @@ beego支持多个目录的静态文件注册, 用户可以注册如下的静态
设置了如上的静态目录之后,用户访问`/images/login/login.png` ,那么就会访问应用对应的目录下面的`images/login/login.png` 文件。如果是访问`/static/img/logo.png` ,那么就访问`public/img/logo.png` 文件。
## 过滤和中间件
beego支持自定义过滤中间件, 例如安全验证, 强制跳转等
如下例子所示, 验证用户名是否是admin, 应用于全部的请求:
var FilterUser = func(w http.ResponseWriter, r *http.Request) {
if r.URL.User == nil || r.URL.User.Username() != "admin" {
http.Error(w, "", http.StatusUnauthorized)
}
if r.URL.User == nil || r.URL.User.Username() != "admin" {
http.Error(w, "", http.StatusUnauthorized)
}
}
beego.Filter(FilterUser)
beego.Filter(FilterUser)
还可以通过参数进行过滤,如果匹配参数就执行
beego.Router("/:id([0-9]+)", & admin.EditController{})
beego.FilterParam("id", func(rw http.ResponseWriter, r *http.Request) {
dosomething()
dosomething()
})
当然你还可以通过前缀过滤
beego.FilterPrefixPath("/admin", func(rw http.ResponseWriter, r *http.Request) {
dosomething()
dosomething()
})
## 控制器设计
基于beego的Controller设计, 只需要匿名组合`beego.Controller` 就可以了,如下所示:
type xxxController struct {
beego.Controller
beego.Controller
}
`beego.Controller` 实现了接口`beego.ControllerInterface` , `beego.ControllerInterface` 定义了如下函数:
@ -227,15 +239,15 @@ beego支持自定义过滤中间件, 例如安全验证, 强制跳转等
- Init(ct *Context, cn string)
这个函数主要初始化了Context、相应的Controller名称, 模板名, 初始化模板参数的容器Data
- Prepare()
这个函数主要是为了用户扩展用的, 这个函数会在下面定义的这些Method方法之前执行, 用户可以重写这个函数实现类似用户验证之类。
- Get()
如果用户请求的HTTP Method是GET, 那么就执行该函数, 默认是403, 用户继承的子struct中可以实现了该方法以处理Get请求.
- Post()
如果用户请求的HTTP Method是POST, 那么就执行该函数, 默认是403, 用户继承的子struct中可以实现了该方法以处理Post请求.
@ -271,60 +283,71 @@ beego支持自定义过滤中间件, 例如安全验证, 强制跳转等
所以通过子struct的方法重写, 用户就可以实现自己的逻辑, 接下来我们看一个实际的例子:
type AddController struct {
beego.Controller
beego.Controller
}
func (this *AddController) Prepare() {
}
func (this *AddController) Get() {
this.Data["content"] ="value"
this.Layout = "admin/layout.html"
this.TplNames = "admin/add.tpl"
}
func (this *AddController) Post() {
pkgname := this.GetString("pkgname")
content := this.GetString("content")
pk := models.GetCruPkg(pkgname)
if pk.Id == 0 {
var pp models.PkgEntity
pp.Pid = 0
pp.Pathname = pkgname
pp.Intro = pkgname
models.InsertPkg(pp)
pk = models.GetCruPkg(pkgname)
}
var at models.Article
at.Pkgid = pk.Id
at.Content = content
models.InsertArticle(at)
this.Ctx.Redirect(302, "/admin/index")
}
func (this *AddController) Prepare() {
}
func (this *AddController) Get() {
this.Data["content"] = "value"
this.Layout = "admin/layout.html"
this.TplNames = "admin/add.tpl"
}
func (this *AddController) Post() {
pkgname := this.GetString("pkgname")
content := this.GetString("content")
pk := models.GetCruPkg(pkgname)
if pk.Id == 0 {
var pp models.PkgEntity
pp.Pid = 0
pp.Pathname = pkgname
pp.Intro = pkgname
models.InsertPkg(pp)
pk = models.GetCruPkg(pkgname)
}
var at models.Article
at.Pkgid = pk.Id
at.Content = content
models.InsertArticle(at)
this.Ctx.Redirect(302, "/admin/index")
}
## 模板处理
### 模板目录
beego中默认的模板目录是`views` , 用户可以把你的模板文件放到该目录下, beego会自动在该目录下的所有模板文件进行解析并缓存, 开发模式下会每次重新解析, 不做缓存。当然用户可以通过如下的方式改变模板的目录:
beego.ViewsPath = "/myviewpath"
### 自动渲染
beego中用户无需手动的调用渲染输出模板, beego会自动的在调用完相应的method方法之后调用Render函数, 当然如果你的应用是不需要模板输出的, 那么你可以在配置文件或者在main.go中设置关闭自动渲染。
配置文件配置如下:
autorender = false
main.go文件中设置如下:
beego.AutoRender = false
### 模板数据
模板中的数据是通过在Controller中`this.Data` 获取的,所以如果你想在模板中获取内容`{{.Content}}` ,那么你需要在Controller中如下设置:
this.Data["Context"] = "value"
### 模板名称
beego采用了Go语言内置的模板引擎, 所有模板的语法和Go的一模一样, 至于如何写模板文件, 详细的请参考[模板教程 ](https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/07.4.md )。
用户通过在Controller的对应方法中设置相应的模板名称, beego会自动的在viewpath目录下查询该文件并渲染, 例如下面的设置, beego会在admin下面找add.tpl文件进行渲染:
@ -341,16 +364,18 @@ beego采用了Go语言内置的模板引擎, 所有模板的语法和Go的一
也就是你对应的Controller名字+请求方法名.模板后缀, 也就是如果你的Controller名是`AddController` ,请求方法是`POST` ,默认的文件后缀是`tpl` ,那么就会默认请求`/viewpath/AddController/POST.tpl` 文件。
### layout设计
beego支持layout设计, 例如你在管理系统中, 其实整个的管理界面是固定的, 只会变化中间的部分, 那么你可以通过如下的设置:
this.Layout = "admin/layout.html"
this.TplNames = "admin/add.tpl"
在layout.html中你必须设置如下的变量:
{{.LayoutContent}}
beego就会首先解析TplNames指定的文件, 获取内容赋值给LayoutContent, 然后最后渲染layout.html文件。
目前采用首先把目录下所有的文件进行缓存, 所以用户还可以通过类似这样的方式实现layout:
@ -359,12 +384,14 @@ beego就会首先解析TplNames指定的文件, 获取内容赋值给LayoutCont
处理逻辑
{{template "footer.html"}}
### 模板函数
beego支持用户定义模板函数, 但是必须在`beego.Run()` 调用之前,设置如下:
func hello(in string)(out string){
out = in + "world"
return
out = in + "world"
return
}
beego.AddFuncMap("hi",hello)
@ -375,35 +402,45 @@ beego支持用户定义模板函数, 但是必须在`beego.Run()`调用之前
目前beego内置的模板函数有如下:
* markdown
* markdown
实现了把markdown文本转化为html信息, 使用方法{{markdown .Content}}
* dateformat
* dateformat
实现了时间的格式化,返回字符串,使用方法{{dateformat .Time "2006-01-02T15:04:05Z07:00"}}
* date
* date
实现了类似PHP的date函数, 可以很方便的根据字符串返回时间, 使用方法{{date .T "Y-m-d H:i:s"}}
* compare
* compare
实现了比较两个对象的比较, 如果相同返回true, 否者false, 使用方法{{compare .A .B}}
* substr
* substr
实现了字符串的截取,支持中文截取的完美截取,使用方法{{substr .Str 0 30}}
* html2str
* html2str
实现了把html转化为字符串, 剔除一些script、css之类的元素, 返回纯文本信息, 使用方法{{html2str .Htmlinfo}}
* str2html
* str2html
实现了把相应的字符串当作HTML来输出, 不转义, 使用方法{{str2html .Strhtml}}
* htmlquote
* htmlquote
实现了基本的html字符转义, 使用方法{{htmlquote .quote}}
* htmlunquote
* htmlunquote
实现了基本的反转移字符,使用方法{{htmlunquote .unquote}}
## request处理
我们经常需要获取用户传递的数据, 包括Get、POST等方式的请求, beego里面会自动解析这些数据, 你可以通过如下方式获取数据
- GetString(key string) string
@ -425,16 +462,18 @@ beego支持用户定义模板函数, 但是必须在`beego.Run()`调用之前
func (this *MainController) Post() {
id := this.Input().Get("id")
intid, err := strconv.Atoi(id)
}
}
更多其他的request的信息, 用户可以通过`this.Ctx.Request` 获取信息,关于该对象的属性和方法参考手册[Request ](http://golang.org/pkg/net/http/#Request )
### 文件上传
在beego中你可以很容易的处理文件上传, 就是别忘记在你的form表单中增加这个属性`enctype="multipart/form-data"` ,否者你的浏览器不会传输你的上传文件。
文件上传之后一般是放在系统的内存里面, 如果文件的size大于设置的缓存内存大小, 那么就放在临时文件中, 默认的缓存内存是64M, 你可以通过如下来调整这个缓存内存大小:
beego.MaxMemory = 1< < 22
beego.MaxMemory = 1< < 22
或者在配置文件中通过如下设置
@ -445,42 +484,46 @@ beego提供了两个很方便的方法来处理文件上传:
- GetFile ( key string ) ( multipart . File , * multipart . FileHeader , error )
该方法主要用于用户读取表单中的文件名 `the_file` , 然后返回相应的信息 , 用户根据这些变量来处理文件上传 : 过滤 、 保存文件等 。
- SaveToFile ( fromfile , tofile string ) error
该方法是在GetFile的基础上实现了快速保存的功能
保存的代码例子如下 :
func ( this * MainController ) Post () {
this . SaveToFile (" the_file ","/ var / www / uploads / uploaded_file . txt "")
}
### JSON和XML输出
beego当初设计的时候就考虑了API功能的设计 , 而我们在设计API的时候经常是输出JSON或者XML数据 , 那么beego提供了这样的方式直接输出 :
JSON数据直接输出 , 设置 `content-type` 为 `application/json` :
func ( this * AddController ) Get () {
mystruct : = { ... }
this . Data [" json "] = & mystruct
this . ServeJson ()
}
mystruct : = { ... }
this . Data [" json "] = & mystruct
this . ServeJson ()
}
XML数据直接输出 , 设置 `content-type` 为 `application/xml` :
func ( this * AddController ) Get () {
mystruct : = { ... }
this . Data [" xml "]=& mystruct
this . ServeXml ()
}
mystruct : = { ... }
this . Data [" xml "]=& mystruct
this . ServeXml ()
}
## 跳转和错误
我们在做Web开发的时候 , 经常会遇到页面调整和错误处理 , beego这这方面也进行了考虑 , 通过 `Redirect` 方法来进行跳转 :
func ( this * AddController ) Get () {
this . Redirect ("/", 302 )
}
this . Redirect ("/", 302 )
}
如何中止此次请求并抛出异常 , beego可以在控制器中这操作
@ -494,12 +537,12 @@ XML数据直接输出, 设置`content-type`为`application/xml`:
this . SetSession (" asta ", v .( int )+ 1 )
this . Data [" Email "] = v .( int )
}
this . TplNames = "index.tpl"
this . TplNames = "index.tpl"
}
这样 `this.Abort("401")` 之后的代码不会再执行 , 而且会默认显示给用户如下页面


beego框架默认支持404 、 401 、 403 、 500 、 503这几种错误的处理 。 用户可以自定义相应的错误处理 , 例如下面重新定义404页面 :
@ -514,7 +557,7 @@ beego框架默认支持404、401、403、500、503这几种错误的处理。用
beego . Errorhandler (" 404 ", page_not_found )
beego . Router ("/", & controllers . MainController {})
beego . Run ()
}
}
我们可以通过自定义错误页面 `404.html` 来处理404错误 。
@ -526,33 +569,37 @@ beego更加人性化的还有一个设计就是支持用户自定义字符串错
data [" content "] = " database is now down "
t . Execute ( rw , data )
}
func main () {
beego . Errorhandler (" dbError ", dbError )
beego . Router ("/", & controllers . MainController {})
beego . Run ()
}
}
一旦在入口注册该错误处理代码 , 那么你可以在任何你的逻辑中遇到数据库错误调用 `this.Abort("dbError")` 来进行异常页面处理 。
## response处理
response可能会有集中情况 :
1. 模板输出
模板输出上面模板介绍里面已经介绍 , beego会在执行完相应的Controller里面的对应的Method之后输出到模板 。
2. 跳转
上一节介绍的跳转就是我们经常用到的页面之间的跳转
3. 字符串输出
有些时候我们只是想输出相应的一个字符串 , 那么我们可以通过如下的代码实现
this . Ctx . WriteString (" ok ")
## Sessions
beego内置了session模块 , 目前session模块支持的后端引擎包括memory 、 file 、 mysql 、 redis四中 , 用户也可以根据相应的interface实现自己的引擎 。
beego中使用session相当方便 , 只要在main入口函数中设置如下 :
@ -604,21 +651,21 @@ sess对象具有如下方法:
- SessionOn
设置是否开启Session , 默认是false , 配置文件对应的参数名 : sessionon
- SessionProvider
设置Session的引擎 , 默认是memory , 目前支持还有file 、 mysql 、 redis等 , 配置文件对应的参数名 : sessionprovider
- SessionName
设置cookies的名字 , Session默认是保存在用户的浏览器cookies里面的 , 默认名是beegosessionID , 配置文件对应的参数名是 : sessionname
- SessionGCMaxLifetime
设置Session过期的时间 , 默认值是3600秒 , 配置文件对应的参数 : sessiongcmaxlifetime
- SessionSavePath
设置对应file 、 mysql 、 redis引擎的保存路径或者链接地址 , 默认值是空 , 配置文件对应的参数 : sessionsavepath
@ -631,13 +678,15 @@ sess对象具有如下方法:
beego . SessionProvider = "mysql"
beego . SessionSavePath = "username:password @protocol (address)/dbname?param=value"
当SessionProvider为redis时 , SessionSavePath是redis的链接地址 , 采用了 [redigo ](https://github.com/garyburd/redigo ), 如下所示 :
beego . SessionProvider = "redis"
beego . SessionSavePath = "127.0.0.1:6379"
beego . SessionSavePath = "127.0.0.1:6379"
## Cache设置
beego内置了一个cache模块 , 实现了类似memcache的功能 , 缓存数据在内存中 , 主要的使用方法如下 :
var (
@ -649,7 +698,7 @@ beego内置了一个cache模块, 实现了类似memcache的功能, 缓存数
urllist . Every = 0 // 不过期
urllist . Start ()
}
func ( this * ShortController ) Post () {
var result ShortResult
longurl : = this.Input().Get("longurl")
@ -672,8 +721,8 @@ beego内置了一个cache模块, 实现了类似memcache的功能, 缓存数
}
this . Data [" json "] = result
this . ServeJson ()
}
}
上面这个例子演示了如何使用beego的Cache模块 , 主要是通过 `beego.NewBeeCache` 初始化一个对象 , 然后设置过期时间 , 开启过期检测 , 在业务逻辑中就可以通过如下的接口进行增删改的操作 :
- Get ( name string ) interface {}
@ -681,7 +730,9 @@ beego内置了一个cache模块, 实现了类似memcache的功能, 缓存数
- Delete ( name string ) ( ok bool , err error )
- IsExist ( name string ) bool
## 安全的Map
我们知道在Go语言里面map是非线程安全的 , 详细的 [atomic_maps ](http://golang.org/doc/faq#atomic_maps )。 但是我们在平常的业务中经常需要用到线程安全的map , 特别是在goroutine的情况下 , 所以beego内置了一个简单的线程安全的map :
bm : = NewBeeMap()
@ -691,16 +742,16 @@ beego内置了一个cache模块, 实现了类似memcache的功能, 缓存数
if ! bm . Check (" astaxie ") {
t . Error (" check err ")
}
if v : = bm.Get("astaxie"); v .( int ) != 1 {
t . Error (" get err ")
}
bm . Delete (" astaxie ")
if bm . Check (" astaxie ") {
t . Error (" delete err ")
}
上面演示了如何使用线程安全的Map , 主要的接口有 :
- Get ( k interface {}) interface {}
@ -708,7 +759,9 @@ beego内置了一个cache模块, 实现了类似memcache的功能, 缓存数
- Check ( k interface {}) bool
- Delete ( k interface {})
## 日志处理
beego默认有一个初始化的BeeLogger对象输出内容到stdout中 , 你可以通过如下的方式设置自己的输出 :
beego . SetLogger (* log . Logger )
@ -717,11 +770,13 @@ beego默认有一个初始化的BeeLogger对象输出内容到stdout中, 你可
fd , err : = os.OpenFile("/var/log/beeapp/beeapp.log", os . O_RDWR | os . O_APPEND , 0644 )
if err != nil {
beego . Critical (" openfile beeapp . log: ", err )
return
beego . Critical (" openfile beeapp . log: ", err )
return
}
lg : = log.New(fd, "", log . Ldate | log . Ltime )
beego . SetLogger ( lg )
### 不同级别的log日志函数
* Trace ( v ... interface {})
@ -734,84 +789,96 @@ beego默认有一个初始化的BeeLogger对象输出内容到stdout中, 你可
你可以通过下面的方式设置不同的日志分级 :
beego . SetLevel ( beego . LevelError )
当你代码中有很多日志输出之后 , 如果想上线 , 但是你不想输出Trace 、 Debug 、 Info等信息 , 那么你可以设置如下 :
beego . SetLevel ( beego . LevelWarning )
这样的话就不会输出小于这个level的日志 , 日志的排序如下 :
LevelTrace 、 LevelDebug 、 LevelInfo 、 LevelWarning 、 LevelError 、 LevelCritical
LevelTrace 、 LevelDebug 、 LevelInfo 、 LevelWarning 、 LevelError 、 LevelCritical
用户可以根据不同的级别输出不同的错误信息 , 如下例子所示 :
### Examples of log messages
- Trace
* " Entered parse function validation block "
* " Validation: entered second ' if '"
* " Dictionary ' Dict ' is empty . Using default value "
- Debug
* " Web page requested: http: // somesite . com Params = '...' "
* " Response generated . Response size: 10000 . Sending ."
* " New file received . Type:PNG Size:20000 "
- Info
* " Web server restarted "
* " Hourly statistics: Requested pages: 12345 Errors: 123 ..."
* " Service paused . Waiting for ' resume ' call "
- Warn
* " Cache corrupted for file = 'test.file' . Reading from back-end "
* " Database 192 . 168 . 0 . 7 / DB not responding . Using backup 192 . 168 . 0 . 8 / DB "
* " No response from statistics server . Statistics not sent "
- Error
* " Internal error . Cannot process request #12345 Error: ...."
* " Cannot perform login: credentials DB not responding "
- Critical
* " Critical panic received: .... Shutting down "
* " Fatal error: ... App is shutting down to prevent data corruption or loss "
### Example
func internalCalculationFunc ( x , y int ) ( result int , err error ) {
beego . Debug (" calculating z . x: ", x ," y: ", y )
beego . Debug (" calculating z . x: ", x , " y: ", y )
z : = y
switch {
case x = = 3 :
case x = = 3:
beego . Trace (" x = = 3 ")
panic (" Failure .")
case y = = 1 :
case y = = 1:
beego . Trace (" y = = 1 ")
return 0 , errors . New (" Error !")
case y = = 2 :
case y = = 2:
beego . Trace (" y = = 2 ")
z = x
default :
default:
beego . Trace (" default ")
z += x
}
retVal : = z- 3
retVal : = z - 3
beego . Debug (" Returning ", retVal )
return retVal , nil
}
}
func processInput ( input inputData ) {
defer func () {
if r : = recover(); r != nil {
beego . Error (" Unexpected error occurred: ", r )
outputs < - outputData { result : 0 , error : true }
}
beego . Error (" Unexpected error occurred: ", r )
outputs < - outputData { result: 0 , error: true }
}
}()
beego . Info (" Received input signal . x: ", input . x ," y: ", input . y )
beego . Info (" Received input signal . x: ", input . x , " y: ", input . y )
res , err : = internalCalculationFunc(input.x, input . y )
res , err : = internalCalculationFunc(input.x, input . y )
if err != nil {
beego . Warn (" Error in calculation: ", err . Error ())
}
beego . Info (" Returning result: ", res ," error: ", err )
outputs < - outputData { result : res , error : err != nil }
beego . Info (" Returning result: ", res , " error: ", err )
outputs < - outputData { result: res , error: err != nil }
}
func main () {
@ -828,16 +895,18 @@ LevelTrace、LevelDebug、LevelInfo、LevelWarning、 LevelError、LevelCritical
for {
select {
case input : = <- inputs:
processInput ( input )
case < - criticalChan:
beego . Critical (" Caught value from criticalChan: Go shut down .")
panic (" Shut down due to critical fault .")
}
case input : = <-inputs:
processInput ( input )
case < -criticalChan:
beego . Critical (" Caught value from criticalChan: Go shut down .")
panic (" Shut down due to critical fault .")
}
}
}
## 配置管理
beego支持解析ini文件 , beego默认会解析当前应用下的 `conf/app.conf` 文件
通过这个文件你可以初始化很多beego的默认参数
@ -849,7 +918,7 @@ beego支持解析ini文件, beego默认会解析当前应用下的`conf/app.conf
autorender = false
autorecover = false
viewspath = "myview"
上面这些参数会替换beego默认的一些参数 。
你可以在配置文件中配置应用需要用的一些配置信息 , 例如下面所示的数据库信息 :
@ -858,7 +927,7 @@ beego支持解析ini文件, beego默认会解析当前应用下的`conf/app.conf
mysqlpass = "rootpass"
mysqlurls = "127.0.0.1"
mysqldb = "beego"
那么你就可以通过如下的方式获取设置的配置信息:
beego . AppConfig . String (" mysqluser ")
@ -874,45 +943,47 @@ AppConfig支持如下方法
- Float ( key string ) ( float64 , error )
- String ( key string ) string
## 系统默认参数
beego中带有很多可配置的参数 , 我们来一一认识一下它们 , 这样有利于我们在接下来的beego开发中可以充分的发挥他们的作用 :
* BeeApp
beego默认启动的一个应用器入口 , 在应用import beego的时候 , 在init中已经初始化的 。
* AppConfig
beego的配置文件解析之后的对象 , 也是在init的时候初始化的 , 里面保存有解析 `conf/app.conf` 下面所有的参数数据
* AppConfigPath
配置文件所在的路径 , 默认是应用程序对应的目录下的 `conf/app.conf` , 用户可以修改该值配置自己的配置文件
配置文件所在的路径 , 默认是应用程序对应的目录下的 `conf/app.conf` , 用户可以修改该值配置自己的配置文件
* HttpAddr
应用监听地址 , 默认为空 , 监听所有的网卡IP
* HttpPort
应用监听端口 , 默认为8080
* AppName
应用名称 , 默认是beego
* RunMode
* RunMode
应用的模式 , 默认是dev , 为开发模式 , 在开发模式下出错会提示友好的出错页面 , 如前面错误描述中所述 。
* AutoRender
是否模板自动渲染 , 默认值为true , 对于API类型的应用 , 应用需要把该选项设置为false , 不需要渲染模板 。
* RecoverPanic
是否异常恢复 , 默认值为true , 即当应用出现异常的情况 , 通过recover恢复回来 , 而不会导致应用异常退出 。
* PprofOn
是否启用pprof , 默认是false , 当开启之后 , 用户可以通过如下地址查看相应的goroutine执行情况
@ -922,48 +993,50 @@ beego中带有很多可配置的参数, 我们来一一认识一下它们, 这
/ debug / pprof / profile
/ debug / pprof / symbol
关于pprof的信息 , 请参考官方的描述 [pprof ](http://golang.org/pkg/net/http/pprof/ )
* ViewsPath
模板路径 , 默认值是views
* SessionOn
session是否开启 , 默认是false
* SessionProvider
session的引擎 , 默认是memory
* SessionName
存在客户端的cookie名称 , 默认值是beegosessionID
* SessionGCMaxLifetime
session过期时间 , 默认值是3600秒
* SessionSavePath
session保存路径 , 默认是空
* UseFcgi
是否启用fastcgi , 默认是false
* MaxMemory
文件上传默认内存缓存大小 , 默认值是 `1 << 26` ( 64M )
* EnableGzip
是否开启gzip支持 , 默认为false不支持gzip , 一旦开启了gzip , 那么在模板输出的内容会进行gzip或者zlib压缩 , 根据用户的Accept-Encoding来判断 。
是否开启gzip支持 , 默认为false不支持gzip , 一旦开启了gzip , 那么在模板输出的内容会进行gzip或者zlib压缩 , 根据用户的Accept-Encoding来判断 。
## 第三方应用集成
beego支持第三方应用的集成 , 用户可以自定义 `http.Handler` , 用户可以通过如下方式进行注册路由 :
beego . RouterHandler ("/ chat / :info (.*)", sockjshandler )
sockjshandler实现了接口 `http.Handler` 。
目前在beego的example中有支持sockjs的chat例子 , 示例代码如下 :
@ -982,7 +1055,7 @@ sockjshandler实现了接口`http.Handler`。
func chatHandler ( s sockjs . Session ) {
users . Add ( s )
defer users . Remove ( s )
for {
m : = s.Receive()
if m = = nil {
@ -1013,7 +1086,9 @@ sockjshandler实现了接口`http.Handler`。
通过上面的代码很简单的实现了一个多人的聊天室 。 上面这个只是一个sockjs的例子 , 我想通过大家自定义 `http.Handler` , 可以有很多种方式来进行扩展beego应用 。
## 部署编译应用
Go语言的应用最后编译之后是一个二进制文件 , 你只需要copy这个应用到服务器上 , 运行起来就行 。 beego由于带有几个静态文件 、 配置文件 、 模板文件三个目录 , 所以用户部署的时候需要同时copy这三个目录到相应的部署应用之下 , 下面以我实际的应用部署为例 :
$ mkdir / opt / app / beepkg
@ -1021,7 +1096,7 @@ Go语言的应用最后编译之后是一个二进制文件, 你只需要copy
$ cp -fr views / opt / app / beepkg
$ cp -fr static / opt / app / beepkg
$ cp -fr conf / opt / app / beepkg
这样在 `/opt/app/beepkg` 目录下面就会显示如下的目录结构 :
.
@ -1033,12 +1108,12 @@ Go语言的应用最后编译之后是一个二进制文件, 你只需要copy
│ └── js
└── views
└── index . tpl
├── beepkg
├── beepkg
这样我们就已经把我们需要的应用搬到服务器了 , 那么接下来就可以开始部署了 , 我现在服务器端用两种方式来run ,
- Supervisord
安装和配置见 [Supervisord ](Supervisord.md )
- nohup方式