怎樣用beego開發服務端應用?

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

怎樣用beego開發服務端應用?

: lijiaocn 建立: 2017/10/23 14:01:13

  • 說明
  • Quick Start
    • 安裝
    • 建立應用
    • 編譯運行
    • 打包發布
    • 代碼產生
  • 開發文檔
  • 目錄結構說明
  • 使用設定檔
  • beego預設參數
  • 路由設定
    • 路由的表述方式
    • 直接設定路由
    • 以註冊handler的方式設定路由
    • 自動註冊路由
    • 通過註解註冊路由
    • 使用namespace管理路由
  • 需要特別注意的NSAfter()
  • 使用資料庫
  • 資料庫遷移(migration)
  • beego.Controller處理http請求
  • 參考

說明

beego是國內團隊開源的golang開發架構,是一個關注度和使用量都比價高的項目。

Quick Start

beego快速入門中給出一個很簡單的例子。

安裝

首先需要安裝beego和bee工具:

$ go get -u github.com/astaxie/beego$ go get -u github.com/beego/bee

為了能夠直接使用bee命令,需要將$GOPATH/bin添加到$PATH變數中。

建立應用

建立一個名為hello的應用,可以選擇web應用,或者api應用:

$ bee new hello     //建立一個web應用$ bee api hello     //建立一個api應用

執行結束後,會在目前的目錄下建立名為hello的目錄:

.|____hello| |____conf| | |____app.conf| |____controllers| | |____default.go| |____main.go| |____models| |____routers| | |____router.go| |____static| | |____css| | |____img| | |____js| | | |____reload.min.js| |____tests| | |____default_test.go| |____views| | |____index.tpl

編譯運行

進入hello目錄中,執行bee run,就會完成編譯、運行:

$ cd hello/$ bee run______| ___ \| |_/ /  ___   ___| ___ \ / _ \ / _ \| |_/ /|  __/|  __/\____/  \___| \___| v1.9.12017/10/23 14:33:05 INFO      0001 Using 'hello' as 'appname'2017/10/23 14:33:05 INFO      0002 Initializing watcher...2017/10/23 14:33:06 SUCCESS   0003 Built Successfully!2017/10/23 14:33:06 INFO      0004 Restarting 'hello'...2017/10/23 14:33:06 SUCCESS   0005 './hello' is running...2017/10/23 14:33:06 [I] [asm_amd64.s:2197] http server Running on http://:8080

打包發布

項目打包發布:

$ bee pack

代碼產生

產生models:

bee generate model user -fields="name:string,age:int"

產生controller:

bee generate controller user

產生view:

bee generate view user

產生文檔:

bee generate docs

開發文檔

beego開發文檔中對beego做了很詳細的說明。

目錄結構說明

.|____hello| |____conf           <- 設定檔| | |____app.conf| |____controllers    <- 控制器,即http請求的handler| | |____default.go| |____main.go        <- main函數| |____models| |____routers        <- 路由,將url關聯到controllers| | |____router.go| |____static         <- 靜態檔案| | |____css| | |____img| | |____js| | | |____reload.min.js| |____tests          <- 測試| | |____default_test.go| |____views          <- 頁面模版,controller中可以直接渲染對應的tpl檔案| | |____index.tpl

使用設定檔

beego參數配置中講解如何使用設定檔、如何配置參數。

beego預設解析應用目錄下的conf/app.conf檔案,配置項可以通過beego.AppConfig.*讀取:

beego.AppConfig.String("mysqluser")

beego.Appconfig包含多個方法:

Set(key, val string) errorString(key string) stringStrings(key string) []stringInt(key string) (int, error)Int64(key string) (int64, error)Bool(key string) (bool, error)Float(key string) (float64, error)DefaultString(key string, defaultVal string) stringDefaultStrings(key string, defaultVal []string)DefaultInt(key string, defaultVal int) intDefaultInt64(key string, defaultVal int64) int64DefaultBool(key string, defaultVal bool) boolDefaultFloat(key string, defaultVal float64) float64DIY(key string) (interface{}, error)GetSection(section string) (map[string]string, error)SaveConfigFile(filename string) error

設定檔中可以配置section,通過runmode指定要使用的section,例如:

appname = beepkghttpaddr = "127.0.0.1"httpport = 9090runmode ="dev"autorender = falserecoverpanic = falseviewspath = "myview"[dev]httpport = 8080[prod]httpport = 8088[test]httpport = 8888

對於section的配置項,通過下面的方式讀取,模式::配置參數名:

beego.AppConfig.String(“dev::mysqluser”)

設定檔中可以使用環境變數:

runmode  = "${ProRunMode||dev}"httpport = "${ProPort||9090}"

載入特定的設定檔,可以載入多個設定檔,key不能衝突:

beego.LoadAppConfig("ini", "conf/app2.conf")beego.LoadAppConfig("ini", "conf/app3.conf")

beego預設參數

beego的預設參數全部儲存在beego.BConfig中。,可以訪問、修改所有的配置資訊。

在設定檔中設定的同名的key(不區分大小寫)的值會覆蓋預設值,例如:

appname = hellohttpport = 8080runmode = dev[dev]AutoRender=false    #會覆蓋beego.BConfig.WebConfig.AutoRender的預設值[test][prod]

App配置:

beego.BConfig.AppName = "beego"beego.BConfig.RunMode = "dev"beego.BConfig.RouterCaseSensitive = truebeego.BConfig.ServerName = "beego"beego.BConfig.RecoverPanic = truebeego.BConfig.EnableGzip = falsebeego.BConfig.MaxMemory = 1 << 26beego.BConfig.EnableErrorsShow = truebeego.BConfig.EnableErrorsRender = true

Web配置:

beego.BConfig.WebConfig.AutoRender = truebeego.BConfig.WebConfig.EnableDocs = truebeego.BConfig.WebConfig.FlashName = "BEEGO_FLASH"beego.BConfig.WebConfig.FlashSeperator = "BEEGOFLASH"beego.BConfig.WebConfig.DirectoryIndex = falsebeego.BConfig.StaticDir = staticbeego.BConfig.WebConfig.StaticExtensionsToGzip = []string{".css", ".js"}beego.BConfig.WebConfig.TemplateLeft="beego.BConfig.WebConfig.TemplateRight="beego.BConfig.WebConfig.ViewsPath="views"beego.BConfig.WebConfig.EnableXSRF = falsebeego.BConfig.WebConfig.XSRFKEY = "beegoxsrf"beego.BConfig.WebConfig.XSRFExpire = 0

監聽配置:

beego.BConfig.Listen.Graceful=falsebeego.BConfig.Listen.ServerTimeOut=0beego.BConfig.Listen.ListenTCP4 = "tcp4"beego.BConfig.Listen.EnableHTTP = truebeego.BConfig.Listen.HTTPAddr = ""beego.BConfig.Listen.HTTPPort = 8080beego.BConfig.Listen.EnableHTTPS = falsebeego.BConfig.Listen.HTTPSAddr = ""beego.BConfig.Listen.HTTPSPort = 10443beego.BConfig.Listen.HTTPSCertFile = "conf/ssl.crt"beego.BConfig.Listen.HTTPSKeyFile = "conf/ssl.key"beego.BConfig.Listen.EnableAdmin = falsebeego.BConfig.Listen.AdminAddr = "localhost"beego.BConfig.Listen.AdminPort = 8088beego.BConfig.Listen.EnableFcgi = falsebeego.BConfig.Listen.EnableStdIo = false

Session配置:

beego.BConfig.WebConfig.Session.SessionOn = falsebeego.BConfig.WebConfig.Session.SessionProvider = ""beego.BConfig.WebConfig.Session.SessionName = "beegosessionID"beego.BConfig.WebConfig.Session.SessionGCMaxLifetime = 3600beego.BConfig.WebConfig.SessionProviderConfigbeego.BConfig.WebConfig.Session.SessionCookieLifeTime = 3600beego.BConfig.WebConfig.Session.SessionAutoSetCookie = truebeego.BConfig.WebConfig.Session.SessionDomain = ""

Log配置:

beego.BConfig.Log.AccessLogs = falsebeego.BConfig.Log.FileLineNum = truebeego.BConfig.Log.Outputs = map[string]string{"console": ""}

路由設定

beego支援三種路由: 基礎路由、正則路由、自動路由。

路由的表述方式

支援用正則的方式書寫路由,參考了sinatra的路由實現。

 路由規則                           可以匹配/api/?:id                ---->  /api/, /api/123 id=123/api/:id                 ---->  /api/123  id=123/api/:id([0-9]+)         ---->  /api/123  id=123/user/:username([\w]+)   ---->  /user/abc username=abc/download/*.*            ---->  /download/file/api.xml  path=file/api ext=xml/download/ceshi/*        ---->  /download/cechis/file/api.json  splat=file/api.json/:id:int                 ---->  等同於/:id([0-9]+)/:hi:string              ---->  等同於/:hi([\w]+)/cms_:id([0-9]+).html    ---->  /cms_123.html  id=123

可以通過*context.Context的Input.Param()方法讀取路由中的變數:

ctx.Input.Param(":id")

在Controller中,通過下面的方式擷取路由中的變數,this是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")

直接設定路由

routers/router.go中設定,可以使用下面的基礎函數直接設定路由:

beego.Get(router, beego.FilterFunc)beego.Post(router, beego.FilterFunc)beego.Put(router, beego.FilterFunc)beego.Head(router, beego.FilterFunc)beego.Options(router, beego.FilterFunc)beego.Delete(router, beego.FilterFunc)beego.Any(router, beego.FilterFunc)

例如:

//響應post /alicebeego.Post("/alice",func(ctx *context.Context){ ctx.Output.Body([]byte("bob"))})//響應到/foo的所有http請求beego.Any("/foo",func(ctx *context.Context){ ctx.Output.Body([]byte("bar"))})

以註冊handler的方式設定路由

也可以使用beego.Handler(router, http.Handler)設定路由的handler:

beego.Handler("/rpc", s)

beego.Handler預設是完全符合,不是首碼匹配。可以自訂http要求方法和處理函數的映射關係:

beego.Router("/api/list",&RestController{},"*:ListFood")beego.Router("/api/create",&RestController{},"post:CreateFood")beego.Router("/api/update",&RestController{},"put:UpdateFood")beego.Router("/api/delete",&RestController{},"delete:DeleteFood")

自訂映射關係的格式為”要求方法:函數名”,要求方法有下面幾種:

*: 包含以下所有的函數,優先順序低於下面的方法get: GET 請求post: POST 請求put: PUT 請求delete: DELETE 請求patch: PATCH 請求options: OPTIONS 請求head: HEAD 請求

自動註冊路由

另外還有beego.AutoRouter($controllers.ObjectController{}),會自動通過反射為Object中的方法產生路由。

通過註解註冊路由

在controller的方法上面加上router注釋,router.go中通過beego.Include(&Controller)引入controller的時候會自動註冊路由。

例如:

// CMS APItype CMSController struct {beego.Controller}func (c *CMSController) URLMapping() {c.Mapping("StaticBlock", c.StaticBlock)c.Mapping("AllBlock", c.AllBlock)}// @router /staticblock/:key [get]func (this *CMSController) StaticBlock() {}// @router /all/:key [get]func (this *CMSController) AllBlock() {}

然後在router.go中:

beego.Include(&CMSController{})

beego會自動進行源碼分析,如果是dev模式,會在routers/commentXXX.go檔案。

使用namespace管理路由

namespace支援前套,並且可以對包含其中對路由進行前置過濾、條件判斷。

namespace介面如下:

NewNamespace(prefix string, funcs …interface{})     初始化 namespace 對象NSCond(cond namespaceCond)      支援滿足條件才namespaceNSBefore(filiterList …FilterFunc)NSAfter(filiterList …FilterFunc)NSInclude(cList …ControllerInterface)NSRouter(rootpath string, c ControllerInterface, mappingMethods …string)NSGet(rootpath string, f FilterFunc)NSPost(rootpath string, f FilterFunc)NSDelete(rootpath string, f FilterFunc)NSPut(rootpath string, f FilterFunc)NSHead(rootpath string, f FilterFunc)NSOptions(rootpath string, f FilterFunc)NSPatch(rootpath string, f FilterFunc)NSAny(rootpath string, f FilterFunc)NSHandler(rootpath string, h http.Handler)NSAutoRouter(c ControllerInterface)NSAutoPrefix(prefix string, c ControllerInterface)

樣本:

//初始化 namespacens :=beego.NewNamespace("/v1",    beego.NSCond(func(ctx *context.Context) bool {        if ctx.Input.Domain() == "api.beego.me" {            return true        }        return false    }),    beego.NSBefore(auth),    beego.NSGet("/notallowed", func(ctx *context.Context) {        ctx.Output.Body([]byte("notAllowed"))    }),    beego.NSRouter("/version", &AdminController{}, "get:ShowAPIVersion"),    beego.NSRouter("/changepassword", &UserController{}),    beego.NSNamespace("/shop",        beego.NSBefore(sentry),        beego.NSGet("/:id", func(ctx *context.Context) {            ctx.Output.Body([]byte("notAllowed"))        }),    ),    beego.NSNamespace("/cms",        beego.NSInclude(            &controllers.MainController{},            &controllers.CMSController{},            &controllers.BlockController{},        ),    ),)//註冊 namespacebeego.AddNamespace(ns)

註冊了以下的路由:

GET /v1/notallowedGET /v1/versionGET /v1/changepasswordPOST /v1/changepasswordGET /v1/shop/123GET /v1/cms/ 對應 MainController、CMSController、BlockController 中得註解路由

需要特別注意的NSAfter()

NSAfter()註冊的filter函數會在請求處理結束的時候被調用,但是要注意在bee 1.9.0中:

beego.NSAfter does not work after controller.ServeJSON

相關的issue:

註解路由無法進入NSBeforecontroller.ServeJSON should work will with beego.NSAfter

可以用github: study-beego裡的的代碼實驗一下。

使用資料庫

beego仿照Digango ORM和SQLAlchemy實現beego ORM,當前支援三個驅動:

MySQL:github.com/go-sql-driver/mysqlPostgreSQL:github.com/lib/pqSqlite3:github.com/mattn/go-sqlite3

beego產生的model檔案中,會自動將model註冊到orm,例如:

bee generate model user -fields="name:string,age:int"

產生的程式碼models/user.go中會在init()中註冊:

func init() {orm.RegisterModel(new(User))}

因此只需要手工書寫orm初始化的代碼,譬如在main.go中:

func init() {orm.RegisterDataBase("default", "mysql", "root:@tcp(127.0.0.1:3306)/mysql?charset=utf8", 30)}

資料庫遷移(migration)

資料庫遷移功能可以資料庫進行升級、復原操作。

產生遷移檔案,user是表名,fields是表結構:

bee generate migration user -driver=mysql -fields="name:string,age:int"

運行後,產生了檔案:

|____database| |____migrations| | |____20171024_154037_user.go

在資料庫中建立了名為study-beego的資料庫後,執行下面的命令:

bee migrate -driver=mysql -conn="root:@tcp(127.0.0.1:3306)/study-beego"

study-beego中的表將會被建立或者更新,並在名為migrations的表中記錄更新。

migrate的子命令refreshrollback執行失敗,原因不明。

beego.Controller處理http請求

注意,在1.9.0中,需要在配置中設定copyrequestbody=true以後,c.Ctx.Input.RequestBody中才有資料。

func (c *UserController) Post() {var v models.Userjson.Unmarshal(c.Ctx.Input.RequestBody, &v)fmt.Println(v)if _, err := models.AddUser(&v); err == nil {c.Ctx.Output.SetStatus(201)c.Data["json"] = v} else {c.Data["json"] = err.Error()}c.ServeJSON()}

參考

  1. beego首頁
  2. beego快速入門
  3. beego開發文檔
  4. beego參數配置
  5. 註解路由無法進入NSBefore
  6. controller.ServeJSON should work will with beego.NSAfter
  7. github: study-beego
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.