From 3fe4465fe69d37d87fd122612c9085eed0534077 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 20 Apr 2013 14:51:59 -0400 Subject: [PATCH 1/2] installation, incomplete quick start --- docs/en/Install.md | 25 ++ docs/en/Quickstart.md | 973 ++++++++++++++++++++++++++++++++++++++++++ docs/en/Why.md | 2 +- 3 files changed, 999 insertions(+), 1 deletion(-) create mode 100644 docs/en/Install.md create mode 100644 docs/en/Quickstart.md diff --git a/docs/en/Install.md b/docs/en/Install.md new file mode 100644 index 00000000..cb76e560 --- /dev/null +++ b/docs/en/Install.md @@ -0,0 +1,25 @@ +#Installation +Beego is a simple web framework, but it uses many third-party packages, so you have to install all dependency packages also. + +- Before anything you do, you have to check that you installed Go in your computer, see more detail about Go installation in my book: [Chapter 1](https://github.com/Unknwon/build-web-application-with-golang_EN/blob/master/eBook/01.1.md) +- Use `go get ` to install Beego: + + go get github.com/astaxie/beego + +- Install bee tools for fast-develop Beego applications: + + go get github.com/astaxie/bee + +Good job, you're ready to Beego with powerful bee tools! + +![](images/bee.png) + +Beego has following dependency packages: + +- Session module: [github.com/astaxie/beego/session](github.com/astaxie/beego/session) +- To support redis engine: [github.com/garyburd/redigo/redis](github.com/garyburd/redigo/redis) +- To support mysql engine: [github.com/go-sql-driver/mysql](github.com/go-sql-driver/mysql) +- To support markdown as template function: [github.com/russross/blackfriday](github.com/russross/blackfriday) + +- [Introduction](README.md) +- [Quick start](Quickstart.md) \ No newline at end of file diff --git a/docs/en/Quickstart.md b/docs/en/Quickstart.md new file mode 100644 index 00000000..0b7df2f3 --- /dev/null +++ b/docs/en/Quickstart.md @@ -0,0 +1,973 @@ +# Quick start +Hey, you say you've never heard about Beego and don't know how to use it? Don't worry, after you read this section, you will know a lot about Beego. Before you start reading, make sure you installed Beego in your computer, if not, check this tutorial: [Installation](Install.md) + +**Navigation** + +- [Hello world](#-1) +- [New project](#-2) +- [Development mode](#-3) +- [Router](#-4) +- [Static files](#-5) +- [Filter and middleware](#-6) +- [Controller](#-7) +- [Template](#-8) +- [Handle request](#request) +- [Redirect and error](#-15) +- [Handle response](#response) +- [Sessions](#sessions) +- [Cache](#cache) +- [Safe map](#map) +- [Log](#-16) +- [Configuration](#-17) +- [Beego arguments](#-18) +- [Integrated third-party applications](#-19) +- [Deployment](#-20) + +## Hello world +This is an example of "Hello world" in Beego: + + package main + + import ( + "github.com/astaxie/beego" + ) + + type MainController struct { + beego.Controller + } + + func (this *MainController) Get() { + this.Ctx.WriteString("hello world") + } + + func main() { + beego.Router("/", &MainController{}) + beego.Run() + } + +Save file as "hello.go", build and run it: + + $ go build main.go + $ ./hello + +Open address [http://127.0.0.1:8080](http://127.0.0.1:8080) in your browser and you will see "hello world". + +What happened in behind above example? + +1. We import package `github.com/astaxie/beego`. As we know that Go initialize packages and runs init() function in every package(more detail [here](https://github.com/Unknwon/build-web-application-with-golang_EN/blob/master/eBook/02.3.md#main-function-and-init-function)), so Beego initializes the BeeApp application at this time. +2. Define controller. We define a struct called `MainController` with a anonymous field `beego.Controller`, so the `MainController` has all methods that `beego.Controller` has. +3. Define RESTful methods. Once we use anonymous combination, `MainController` has already had `Get`, `Post`, `Delete`, `Put` and other methods, these methods will be called when user sends corresponding request, like `Post` method for requests that are using POST method. Therefore, after we overloaded `Get` method in `MainController`, all GET requests will use `Get` method in `MainController` instead of in `beego.Controller`. +4. Define main function. All applications in Go use main function as entry point as C does. +5. Register routers, it tells Beego which controller is responsibility for specific requests. Here we register `/` for `MainController`, so all requests in `/` will be handed to `MainController`. Be aware that the first argument is the path and the second one is pointer of controller that you want to register. +6. Run application in port 8080 as default, press `Ctrl+c` to exit. + +## New project +Get into your $GOPATH, then use following command to setup Beego project: + + bee create hello + +It generates folders and files for your project, directory structure as follows: + + . + ├── conf + │ └── app.conf + ├── controllers + │ └── default.go + ├── main.go + ├── models + ├── static + │ ├── css + │ ├── img + │ └── js + └── views + └── index.tpl + +## Development mode +Beego uses development mode as default, you can use following code to change mode in your application: + + beego.RunMode = "pro" + +Or use configuration file in `conf/app.conf`, and input following content: + + runmode = pro + +No differences between two ways. + +In development mode, you have following effects: + +- If you don't have directory `views`, it prints following error prompt: + + 2013/04/13 19:36:17 [W] [stat views: no such file or directory] + +- It doesn't cache template and reload every time. +- If panic occurs in your server, it prints information like following screen shot: + +![](images/dev.png) + +## Router + +路由的主要功能是实现从请求地址到实现方法,beego中封装了`Controller`,所以路由是从路径到`ControllerInterface`的过程,`ControllerInterface`的方法有如下: + + type ControllerInterface interface { + Init(ct *Context, cn string) + Prepare() + Get() + Post() + Delete() + Put() + Head() + Patch() + Options() + Finish() + Render() error + } + +这些方法`beego.Controller`都已经实现了,所以只要用户定义struct的时候匿名包含就可以了。当然更灵活的方法就是用户可以去自定义类似的方法,然后实现自己的逻辑。 + +用户可以通过如下的方式进行路由设置: + + beego.Router("/", &controllers.MainController{}) + beego.Router("/admin", &admin.UserController{}) + beego.Router("/admin/index", &admin.ArticleController{}) + beego.Router("/admin/addpkg", &admin.AddController{}) + +为了用户更加方便的路由设置,beego参考了sinatra的路由实现,支持多种方式的路由: + +- beego.Router("/api/:id([0-9]+)", &controllers.RController{}) + 自定义正则匹配 //匹配 /api/123 :id= 123 + +- beego.Router("/news/:all", &controllers.RController{}) + 全匹配方式 //匹配 /news/path/to/123.html :all= path/to/123.html + +- beego.Router("/user/:username([\w]+)", &controllers.RController{}) + 正则字符串匹配 //匹配 /user/astaxie :username = astaxie + +- 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]+) + +## 静态文件 +Go语言内部其实已经提供了`http.ServeFile`,通过这个函数可以实现静态文件的服务。beego针对这个功能进行了一层封装,通过下面的方式进行静态文件注册: + + beego.SetStaticPath("/static","public") + +- 第一个参数是路径,url路径信息 +- 第二个参数是静态文件目录(相对应用所在的目录) + +beego支持多个目录的静态文件注册,用户可以注册如下的静态文件目录: + + beego.SetStaticPath("/images","images") + beego.SetStaticPath("/css","css") + beego.SetStaticPath("/js","js") + +设置了如上的静态目录之后,用户访问`/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) + } + } + + beego.Filter(FilterUser) + +还可以通过参数进行过滤,如果匹配参数就执行 + + beego.Router("/:id([0-9]+)", &admin.EditController{}) + beego.FilterParam("id", func(rw http.ResponseWriter, r *http.Request) { + dosomething() + }) + +当然你还可以通过前缀过滤 + + beego.FilterPrefixPath("/admin", func(rw http.ResponseWriter, r *http.Request) { + dosomething() + }) + +## 控制器设计 +基于beego的Controller设计,只需要匿名组合`beego.Controller`就可以了,如下所示: + + type xxxController struct { + beego.Controller + } + +`beego.Controller`实现了接口`beego.ControllerInterface`,`beego.ControllerInterface`定义了如下函数: + +- Init(ct *Context, cn string) + + 这个函数主要初始化了Context、相应的Controller名称,模板名,初始化模板参数的容器Data + +- Prepare() + + 这个函数主要是为了用户扩展用的,这个函数会在下面定义的这些Method方法之前执行,用户可以重写这个函数实现类似用户验证之类。 + +- Get() + + 如果用户请求的HTTP Method是GET, 那么就执行该函数,默认是403,用户继承的子struct中可以实现了该方法以处理Get请求. + +- Post() + + 如果用户请求的HTTP Method是POST, 那么就执行该函数,默认是403,用户继承的子struct中可以实现了该方法以处理Post请求. + +- Delete() + + 如果用户请求的HTTP Method是DELETE, 那么就执行该函数,默认是403,用户继承的子struct中可以实现了该方法以处理Delete请求. + +- Put() + + 如果用户请求的HTTP Method是PUT, 那么就执行该函数,默认是403,用户继承的子struct中可以实现了该方法以处理Put请求. + +- Head() + + 如果用户请求的HTTP Method是HEAD, 那么就执行该函数,默认是403,用户继承的子struct中可以实现了该方法以处理Head请求. + +- Patch() + + 如果用户请求的HTTP Method是PATCH, 那么就执行该函数,默认是403,用户继承的子struct中可以实现了该方法以处理Patch请求. + +- Options() + + 如果用户请求的HTTP Method是OPTIONS, 那么就执行该函数,默认是403,用户继承的子struct中可以实现了该方法以处理Options请求. + +- Finish() + + 这个函数实在执行完相应的http Method方法之后执行的,默认是空,用户可以在子Strcut中重写这个函数,执行例如数据库关闭,清理数据之类的工作 + +- Render() error + + 这个函数主要用来实现渲染模板,如果beego.AutoRender为true的情况下才会执行。 + +所以通过子struct的方法重写,用户就可以实现自己的逻辑,接下来我们看一个实际的例子: + + type AddController struct { + 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") + } + +## 模板处理 +### 模板目录 +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文件进行渲染: + + this.TplNames = "admin/add.tpl" + +我们看到上面的模板后缀名是tpl,beego默认情况下支持tpl和html后缀名的模板文件,如果你的后缀名不是这两种,请进行如下设置: + + beego.AddTemplateExt("你文件的后缀名") + +当你设置了自动渲染,然后在你的Controller中没有设置任何的TplNames,那么beego会自动设置你的模板文件如下: + + c.TplNames = c.ChildName + "/" + c.Ctx.Request.Method + "." + c.TplExt + +也就是你对应的Controller名字+请求方法名.模板后缀,也就是如果你的Controller名是`AddController`,请求方法是`POST`,默认的文件后缀是`tpl`,那么就会默认请求`/viewpath/AddController/POST.tpl`文件。 + +### lauout设计 +beego支持layout设计,例如你在管理系统中,其实整个的管理界面是固定的,支会变化中间的部分,那么你可以通过如下的设置: + + this.Layout = "admin/layout.html" + this.TplNames = "admin/add.tpl" + +在layout.html中你必须设置如下的变量: + + {{.LayoutContent}} + +beego就会首先解析TplNames指定的文件,获取内容赋值给LayoutContent,然后最后渲染layout.html文件。 + +目前采用首先把目录下所有的文件进行缓存,所以用户还可以通过类似这样的方式实现layout: + + {{template "header.html"}} + 处理逻辑 + {{template "footer.html"}} + +### 模板函数 +beego支持用户定义模板函数,但是必须在`beego.Run()`调用之前,设置如下: + + func hello(in string)(out string){ + out = in + "world" + return + } + + beego.AddFuncMap("hi",hello) + +定义之后你就可以在模板中这样使用了: + + {{.Content | hi}} + +目前beego内置的模板函数有如下: + +* markdown + + 实现了把markdown文本转化为html信息,使用方法{{markdown .Content}} +* dateformat + + 实现了时间的格式化,返回字符串,使用方法{{dateformat .Time "2006-01-02T15:04:05Z07:00"}} +* date + + 实现了类似PHP的date函数,可以很方便的根据字符串返回时间,使用方法{{date .T "Y-m-d H:i:s"}} +* compare + + 实现了比较两个对象的比较,如果相同返回true,否者false,使用方法{{compare .A .B}} +* substr + + 实现了字符串的截取,支持中文截取的完美截取,使用方法{{substr .Str 0 30}} +* html2str + + 实现了把html转化为字符串,剔除一些script、css之类的元素,返回纯文本信息,使用方法{{html2str .Htmlinfo}} +* str2html + + 实现了把相应的字符串当作HTML来输出,不转义,使用方法{{str2html .Strhtml}} +* htmlquote + + 实现了基本的html字符转义,使用方法{{htmlquote .quote}} +* htmlunquote + + 实现了基本的反转移字符,使用方法{{htmlunquote .unquote}} + +## request处理 +我们经常需要获取用户传递的数据,包括Get、POST等方式的请求,beego里面会自动解析这些数据,你可以通过如下方式获取数据 + +- GetString(key string) string +- GetInt(key string) (int64, error) +- GetBool(key string) (bool, error) + +使用例子如下: + + func (this *MainController) Post() { + jsoninfo := this.GetString("jsoninfo") + if jsoninfo == "" { + this.Ctx.WriteString("jsoninfo is empty") + return + } + } + +如果你需要的数据可能是其他类型的,例如是int类型而不是int64,那么你需要这样处理: + + 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 + +或者在配置文件中通过如下设置 + + maxmemory = 1<<22 + +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() + } + +XML数据直接输出,设置`content-type`为`application/xml`: + + func (this *AddController) Get() { + mystruct := { ... } + this.Data["xml"]=&mystruct + this.ServeXml() + } + +## 跳转和错误 +我们在做Web开发的时候,经常会遇到页面调整和错误处理,beego这这方面也进行了考虑,通过`Redirect`方法来进行跳转: + + func (this *AddController) Get() { + this.Redirect("/", 302) + } + +@todo 错误处理还需要后期改进 + +## response处理 +response可能会有集中情况: + +1. 模板输出 + + 模板输出上面模板介绍里面已经介绍,beego会在执行完相应的Controller里面的对应的Method之后输出到模板。 + +2. 跳转 + + 上一节介绍的跳转就是我们经常用到的页面之间的跳转 + +3. 字符串输出 + + 有些时候我们只是想输出相应的一个字符串,那么我们可以通过如下的代码实现 + + this.Ctx.WriteString("ok") + +## Sessions +beego内置了session模块,目前session模块支持的后端引擎包括memory、file、mysql、redis四中,用户也可以根据相应的interface实现自己的引擎。 + +beego中使用session相当方便,只要在main入口函数中设置如下: + + beego.SessionOn = true + +或者通过配置文件配置如下: + + sessionon = true + +通过这种方式就可以开启session,如何使用session,请看下面的例子: + + func (this *MainController) Get() { + v := this.GetSession("asta") + if v == nil { + this.SetSession("asta", int(1)) + this.Data["num"] = 0 + } else { + this.SetSession("asta", v.(int)+1) + this.Data["num"] = v.(int) + } + this.TplNames = "index.tpl" + } + +上面的例子中我们知道session有几个方便的方法: + +- SetSession(name string, value interface{}) +- GetSession(name string) interface{} +- DelSession(name string) + +session操作主要有设置session、获取session、删除session + +当然你要可以通过下面的方式自己控制相应的逻辑这些逻辑: + + sess:=this.StartSession() + defer sess.SessionRelease() + +sess对象具有如下方法: + +* sess.Set() +* sess.Get() +* sess.Delete() +* sess.SessionID() + +但是我还是建议大家采用SetSession、GetSession、DelSession三个方法来操作,避免自己在操作的过程中资源没释放的问题。 + +关于Session模块使用中的一些参数设置: + +- 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 + + +当SessionProvider为file时,SessionSavePath是只保存文件的目录,如下所示: + + beego.SessionProvider = "file" + beego.SessionSavePath = "./tmp" + +当SessionProvider为mysql时,SessionSavePath是链接地址,采用[go-sql-driver](https://github.com/go-sql-driver/mysql),如下所示: + + 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" + +## Cache设置 +beego内置了一个cache模块,实现了类似memcache的功能,缓存数据在内存中,主要的使用方法如下: + + var ( + urllist *beego.BeeCache + ) + + func init() { + urllist = beego.NewBeeCache() + urllist.Every = 0 //不过期 + urllist.Start() + } + + func (this *ShortController) Post() { + var result ShortResult + longurl := this.Input().Get("longurl") + beego.Info(longurl) + result.UrlLong = longurl + urlmd5 := models.GetMD5(longurl) + beego.Info(urlmd5) + if urllist.IsExist(urlmd5) { + result.UrlShort = urllist.Get(urlmd5).(string) + } else { + result.UrlShort = models.Generate() + err := urllist.Put(urlmd5, result.UrlShort, 0) + if err != nil { + beego.Info(err) + } + err = urllist.Put(result.UrlShort, longurl, 0) + if err != nil { + beego.Info(err) + } + } + this.Data["json"] = result + this.ServeJson() + } + +上面这个例子演示了如何使用beego的Cache模块,主要是通过`beego.NewBeeCache`初始化一个对象,然后设置过期时间,开启过期检测,在业务逻辑中就可以通过如下的接口进行增删改的操作: + +- Get(name string) interface{} +- Put(name string, value interface{}, expired int) error +- 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() + if !bm.Set("astaxie", 1) { + t.Error("set Error") + } + 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{} +- Set(k interface{}, v interface{}) bool +- Check(k interface{}) bool +- Delete(k interface{}) + +## 日志处理 +beego默认有一个初始化的BeeLogger对象输出内容到stdout中,你可以通过如下的方式设置自己的输出: + + beego.SetLogger(*log.Logger) + +只要你的输出符合`*log.Logger`就可以,例如输出到文件: + + 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 + } + lg := log.New(fd, "", log.Ldate|log.Ltime) + beego.SetLogger(lg) +### 不同级别的log日志函数 + +* Trace(v ...interface{}) +* Debug(v ...interface{}) +* Info(v ...interface{}) +* Warn(v ...interface{}) +* Error(v ...interface{}) +* Critical(v ...interface{}) + +你可以通过下面的方式设置不同的日志分级: + + beego.SetLevel(beego.LevelError) + +当你代码中有很多日志输出之后,如果想上线,但是你不想输出Trace、Debug、Info等信息,那么你可以设置如下: + + beego.SetLevel(beego.LevelWarning) + +这样的话就不会输出小于这个level的日志,日志的排序如下: + +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) + z := y + switch { + case x == 3 : + beego.Trace("x == 3") + panic("Failure.") + case y == 1 : + beego.Trace("y == 1") + return 0, errors.New("Error!") + case y == 2 : + beego.Trace("y == 2") + z = x + default : + beego.Trace("default") + z += x + } + 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.Info("Received input signal. x:",input.x," y:", 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} + } + + func main() { + inputs = make(chan inputData) + outputs = make(chan outputData) + criticalChan = make(chan int) + beego.Info("App started.") + + go consumeResults(outputs) + beego.Info("Started receiving results.") + + go generateInputs(inputs) + beego.Info("Started sending signals.") + + 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.") + } + } + } + +## 配置管理 +beego支持解析ini文件, beego默认会解析当前应用下的`conf/app.conf`文件 + +通过这个文件你可以初始化很多beego的默认参数 + + appname = beepkg + httpaddr = "127.0.0.1" + httpport = 9090 + runmode ="dev" + autorender = false + autorecover = false + viewspath = "myview" + +上面这些参数会替换beego默认的一些参数。 + +你可以在配置文件中配置应用需要用的一些配置信息,例如下面所示的数据库信息: + + mysqluser = "root" + mysqlpass = "rootpass" + mysqlurls = "127.0.0.1" + mysqldb = "beego" + +那么你就可以通过如下的方式获取设置的配置信息: + + beego.AppConfig.String("mysqluser") + beego.AppConfig.String("mysqlpass") + beego.AppConfig.String("mysqlurls") + beego.AppConfig.String("mysqldb") + +AppConfig支持如下方法 + +- Bool(key string) (bool, error) +- Int(key string) (int, error) +- Int64(key string) (int64, error) +- Float(key string) (float64, error) +- String(key string) string + +## 系统默认参数 +beego中带有很多可配置的参数,我们来一一认识一下它们,这样有利于我们在接下来的beego开发中可以充分的发挥他们的作用: + +* BeeApp + + beego默认启动的一个应用器入口,在应用import beego的时候,在init中已经初始化的。 + +* AppConfig + + beego的配置文件解析之后的对象,也是在init的时候初始化的,里面保存有解析`conf/app.conf`下面所有的参数数据 + +* HttpAddr + + 应用监听地址,默认为空,监听所有的网卡IP + +* HttpPort + + 应用监听端口,默认为8080 + +* AppName + + 应用名称,默认是beego + +* RunMode + + 应用的模式,默认是dev,为开发模式,在开发模式下出错会提示友好的出错页面,如前面错误描述中所述。 + +* AutoRender + + 是否模板自动渲染,默认值为true,对于API类型的应用,应用需要把该选项设置为false,不需要渲染模板。 + +* RecoverPanic + + 是否异常恢复,默认值为true,即当应用出现异常的情况,通过recover恢复回来,而不会导致应用异常退出。 + +* PprofOn + + 是否启用pprof,默认是false,当开启之后,用户可以通过如下地址查看相应的goroutine执行情况 + + /debug/pprof + /debug/pprof/cmdline + /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) + +## 第三方应用集成 +beego支持第三方应用的集成,用户可以自定义`http.Handler`,用户可以通过如下方式进行注册路由: + + beego.RouterHandler("/chat/:info(.*)", sockjshandler) + +sockjshandler实现了接口`http.Handler`。 + +目前在beego的example中有支持sockjs的chat例子,示例代码如下: + + package main + + import ( + "fmt" + "github.com/astaxie/beego" + "github.com/fzzy/sockjs-go/sockjs" + "strings" + ) + + var users *sockjs.SessionPool = sockjs.NewSessionPool() + + func chatHandler(s sockjs.Session) { + users.Add(s) + defer users.Remove(s) + + for { + m := s.Receive() + if m == nil { + break + } + fullAddr := s.Info().RemoteAddr + addr := fullAddr[:strings.LastIndex(fullAddr, ":")] + m = []byte(fmt.Sprintf("%s: %s", addr, m)) + users.Broadcast(m) + } + } + + type MainController struct { + beego.Controller + } + + func (m *MainController) Get() { + m.TplNames = "index.html" + } + + func main() { + conf := sockjs.NewConfig() + sockjshandler := sockjs.NewHandler("/chat", chatHandler, conf) + beego.Router("/", &MainController{}) + beego.RouterHandler("/chat/:info(.*)", sockjshandler) + beego.Run() + } + +通过上面的代码很简单的实现了一个多人的聊天室。上面这个只是一个sockjs的例子,我想通过大家自定义`http.Handler`,可以有很多种方式来进行扩展beego应用。 + +## 部署编译应用 +Go语言的应用最后编译之后是一个二进制文件,你只需要copy这个应用到服务器上,运行起来就行。beego由于带有几个静态文件、配置文件、模板文件三个目录,所以用户部署的时候需要同时copy这三个目录到相应的部署应用之下,下面以我实际的应用部署为例: + + $ mkdir /opt/app/beepkg + $ cp beepkg /opt/app/beepkg + $ cp -fr views /opt/app/beepkg + $ cp -fr static /opt/app/beepkg + $ cp -fr conf /opt/app/beepkg + +这样在`/opt/app/beepkg`目录下面就会显示如下的目录结构: + + . + ├── conf + │ ├── app.conf + ├── static + │ ├── css + │ ├── img + │ └── js + └── views + └── index.tpl + ├── beepkg + +这样我们就已经把我们需要的应用搬到服务器了,那么接下来就可以开始部署了,我现在服务器端用两种方式来run, + +- Supervisord + + 安装和配置见[Supervisord](Supervisord.md) + +- nohup方式 + + nohup ./beepkg & + +个人比较推荐第一种方式,可以很好的管理起来应用 + +- [Introduction](README.md) +- [Step by step](Tutorial.md) \ No newline at end of file diff --git a/docs/en/Why.md b/docs/en/Why.md index a84b0790..86e2a136 100644 --- a/docs/en/Why.md +++ b/docs/en/Why.md @@ -6,7 +6,7 @@ Remember when I was writing the book about how to build web applications with Go I used to use CI in PHP and tornado in Python, there are both lightweight, so they has following advantages: 1. Save time for handling general problems, I only need to care about logic part. -2. Learn more languages by studying their source code, it's not hard to read and understand them because they are both lightweight frameworks. +2. Learn more about languages by studying their source code, it's not hard to read and understand them because they are both lightweight frameworks. 3. It's quite easy to make secondary development of these frameworks for specific purposes. Those reasons are my original intention of implementing Beego, and used two chapters in my book to introduce and design this lightweight web framework in GO. From 6bd9ecc98bd29725aabb6d13a22b485158444cb3 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 20 Apr 2013 14:54:42 -0400 Subject: [PATCH 2/2] installation, incomplete quick start --- docs/en/images/dev.png | Bin 0 -> 69679 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/en/images/dev.png diff --git a/docs/en/images/dev.png b/docs/en/images/dev.png new file mode 100644 index 0000000000000000000000000000000000000000..f051cf888eff0b3b6a535015ef54e82d2794f8bd GIT binary patch literal 69679 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

E>n)&!S{4TOwLs5Rw$#ucb&uMUjszh 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 literal 0 HcmV?d00001