beego 框架基本使用 && 知識點整理


beego 官網的教程已經整理的非常詳細了,但作為一個剛接觸的學習者,還是有必要做一下整理,這樣在后面使用的時候遇到了不太熟悉的地方,還能反過頭來看下自己整理的內容,快速的把知識再撈回來,下面是對官網的一個精簡整理,同時結合一些例子,更好的理解和使用 beego 這個框架去做一些 web 開發

beego 官網地址:https://beego.me

 

beego 與 bee 的安裝

//beego 框架
go get github.com/astaxie/beego
//bee工具
go get github.com/beego/bee

 

bee 工具是一個為了協助快速開發 beego 項目而創建的項目工具,通過 bee 可以很容易的進行 beego 項目的創建,熱編譯,開發,測試和部署。

當我們安裝好 bee 工具后,bee 命令默認是放在 GOPATH/bin 目錄下

 

bee 常用命令

1)bee new <項目名> 

創建一個項目,這樣的項目一般是 web 項目

bee new MyWeb

需要注意的是,這個命令會在 $GOPATH/src 目錄下生成框架代碼,目錄結構是:

├── 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

 

2)bee api <api項目名>

bee api MyAPI

創建一個 api 項目,目錄結構是:

├── conf
│   └── app.conf
├── controllers
│   ├── object.go
│   └── user.go
├── main.go
├── models
│   ├── object.go
│   └── user.go
├── routers
│   └── router.go
└── tests
    └── default_test.go

 

3)bee run

這個命令是監控 beego 的項目,通過 fsnotify 監控文件系統,但是注意該命令必須在 $GOPATH/src/appname 目錄下執行,否則提示:Failed to build the application

這樣當我們在開發過程中,beego 可以實時監測我們的代碼文件發生變化,這樣我們就不用重新編譯運行,非常方便調試

 

通過 bee run 運行上面創建的 MyWeb 項目:

D:\golang_workspace\project\src\MyWeb>bee run
______
| ___ \
| |_/ /  ___   ___
| ___ \ / _ \ / _ \
| |_/ /|  __/|  __/
\____/  \___| \___| v1.10.0
2019/07/15 22:43:59 INFO     ▶ 0001 Using 'MyWeb' as 'appname'
2019/07/15 22:43:59 INFO     ▶ 0002 Initializing watcher...
github.com/shiena/ansicolor
github.com/astaxie/beego/config
github.com/astaxie/beego/vendor/gopkg.in/yaml.v2
github.com/astaxie/beego/toolbox
github.com/astaxie/beego/utils
github.com/astaxie/beego/grace
github.com/astaxie/beego/vendor/golang.org/x/crypto/acme
github.com/astaxie/beego/logs
github.com/astaxie/beego/session
github.com/astaxie/beego/vendor/golang.org/x/crypto/acme/autocert
github.com/astaxie/beego/context
github.com/astaxie/beego/context/param
github.com/astaxie/beego
MyWeb/controllers
MyWeb/routers
MyWeb
2019/07/15 22:44:02 SUCCESS  ▶ 0003 Built Successfully!
2019/07/15 22:44:02 INFO     ▶ 0004 Restarting 'MyWeb.exe'...
2019/07/15 22:44:02 SUCCESS  ▶ 0005 './MyWeb.exe' is running...
2019/07/15 22:44:02.644 [I] [asm_amd64.s:1337]  http server Running on http://:8080

  

通過瀏覽器訪問:http:127.0.0.1:8080,可以看到下圖所示:

 

beego 架構

1)beego 架構圖

這是 beego 的 8 個獨立的模塊:

 

 2)beego 執行邏輯

由圖可知,beego 是一個典型的 MVC 架構,

從上面的 MyWeb 的目錄接口也可以看出來,M(models)、V(views)和 C(controllers)的結構

 

beego 路由設置

1)beego main

package main

import (
	_ "MyWeb/routers"
	"github.com/astaxie/beego"
)

func main() {
	beego.Run()
}

引入了一個包 "MyWeb/routers",下面看一下這個包的內容

 

2)routers

這里僅僅做了一個優化,路由包里面我們看到了 beego.Router() 方法執行了路由注冊,這個方法是映射 url 到 controller

第一個參數是 url(用戶的請求地址),這里注冊的是 "/",也就是我們訪問的根路由,第二個參數是對應的 controller,也就是即將把請求分發到哪個控制器來執行相應的邏輯

package routers

import (
	"MyWeb/controllers"
	"github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &controllers.MainController{})
}

對路由設置的一個小結:

  1. Router() 方法設置 url 和 controller
  2. 程序啟動時,路由配置加載好,保存在 map 中
  3. 請求處理時,通過請求的 url 進行查找對應的 controller,把請求分發到 controller 執行
  4. 我們的要做的是在 controller 中編寫業務代碼即可

 

3)controller

對下面代碼進行簡單分析:

  1. 用戶的 controller 嵌套 beego.Controller,繼承 beego.Controller 所有屬性和方法
  2. Controller 默認使用 restful 的風格,Get 請求對應 Get() 方法
  3. 通過對應的業務處理之后,把數據賦值給 Controller.Data 這個 map 即可

c.TplName = "index.tpl" 會默認到 views 目錄下查找模板文件

package controllers

import (
	"github.com/astaxie/beego"
)

type MainController struct {
	beego.Controller  //這里可以看做是繼承
}

func (c *MainController) Get() {
	c.Data["Website"] = "beego.me"
	c.Data["Email"] = "astaxie@gmail.com"
	c.TplName = "index.tpl"
}

  

除了上面的 c.Data 這種方法之外,還有其它方法返回響應數據,如常用的 c.ServerJson() 方法,這樣就會去 c.Data 中尋找 key 為 json 的值

用戶設置了模板之后系統會自動調用 Render() 函數(這個函數是在 beego.Controller 中實現的),所以無需用戶自己來調用渲染

當然也可以不使用模板,直接用 c.Ctx.WriteString() 方法輸出字符串,如:

func (c *MainController) Get() {
        c.Ctx.WriteString("hello")
}

  

4)正則路由

beego.Router("/api/?:id", &controllers.RController{}) 默認匹配 //匹配 /api/123 :id = 123 可以匹配 /api/ 這個URL

beego.Router("/api/:id", &controllers.RController{}) 默認匹配 //匹配 /api/123 :id = 123 不可以匹配 /api/ 這個URL

beego.Router("/api/:id([0-9]+)", &controllers.RController{}) 自定義正則匹配 //匹配 /api/123 :id = 123

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]+)

beego.Router("/cms_:id([0-9]+).html", &controllers.CmsController{}) 帶有前綴的自定義正則 //匹配 :id 為正則類型。匹配 cms_123.html 這樣的 url :id = 123

 

可以在 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 規則:
beego.Router("/", &IndexController{}, "*:Index")
使用第三個參數,第三個參數就是用來設置對應 method 到函數名,定義如下

  • *表示任意的 method 都執行該函數
  • 使用 httpmethod:funcname 格式來展示
  • 多個不同的格式使用 ; 分割
  • 多個 method 對應同一個 funcname,method 之間通過 , 來分割

beego.Router("/api",&RestController{},"get,post:ApiFunc")

可用的 HTTP Method:

  • *: 包含以下所有的函數
  • get: GET 請求
  • post: POST 請求
  • put: PUT 請求
  • delete: DELETE 請求
  • patch: PATCH 請求
  • options: OPTIONS 請求
  • head: HEAD 請求

如果同時存在 * 和對應的 HTTP Method,那么優先執行 HTTP Method 的方法

 

beego model

web 應用中用的最多的就是數據庫操作,而 model 層一般用來做這些操作,bee new 例子不存在 model 的演示,但是 bee api 應用中存在 model 的應用,說的簡單一點,如果你的應用足夠簡單,那么 Controller 可以處理一切的邏輯,如果你的邏輯里面存在着可以復用的東西,那么就抽取出來變成一個模塊,因此 model 是逐步抽象的過程

 

beego views

beego 模板默認支持 .tpl 和 .html 兩種后綴

beego.AddTemplateExt()  方法增加新的模板后綴

beego 模板用的就是 Go 官網自帶的模板

 

beego static

beego 默認注冊了 static 目錄為靜態處理的目錄

注冊樣式:url 前綴和映射的目錄(在 /main.go 文件中 beego.Run() 之前加入)

StaticDir["/static"] = "static"

 

beego 默認使用 static 目錄作為靜態文件目錄

beego.SetStaticPath() 方法增加新的靜態文件目錄

 

beego conf(配置文件)

默認的配置文件內容:

appname = MyWeb
httpport = 8080
runmode = dev

  

增加配置文件內容:

appname = MyWeb
httpport = 8080
runmode = dev

mysqlhost = 127.0.0.1
mysqlport = 3308
username = root
passwd = 123

 

獲取配置文件中變量的值:

beego.AppConfig.String("mysqlhost")
beego.AppConfig.String("mysqlport")

  

可以通過 [命名] 的方式將配置文件進行分組,然后在獲取變量時,可以通過下面的方式獲取

設置變量的值:

appname = MyWeb
httpport = 8080
runmode = dev

[dbconfig]
mysqlhost = 127.0.0.1
mysqlport = 3308
username = root
passwd = 123

獲取變量的值:

beego.AppConfig.String("dbconfig::mysqlhost")
beego.AppConfig.String("dbconfig::mysqlport")

  

Appconfig 的方法如下:

Set(key, val string) error
String(key string) string
Strings(key string) []string
Int(key string) (int, error)
Int64(key string) (int64, error)
Bool(key string) (bool, error)
Float(key string) (float64, error)
DefaultString(key string, defaultVal string) string
DefaultStrings(key string, defaultVal []string)
DefaultInt(key string, defaultVal int) int
DefaultInt64(key string, defaultVal int64) int64
DefaultBool(key string, defaultVal bool) bool
DefaultFloat(key string, defaultVal float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error

  

獲取用戶請求參數

Controller 中的方法獲取(不論是 post 還是 get 的請求方式,都可以通過上面的方式獲取)

  1. GetString(key string) string
  2. GetStrings(key string) []string
  3. GetInt(key string) (int64, error)
  4. GetBool(key string) (bool, error)
  5. GetFloat(key string) (float64, error)

 

如果在平常開發中肯定涉及到 json 格式的數據,那么獲取 json 格式的數據可以通過下面的方法:

Ctx.Input.RequestBody  //獲取原始數據

配置文件里設置 copyrequestbody = true,這樣就可以通過 c.Ctx.Input.RequestBody 獲取了

 

 

參考鏈接:https://www.cnblogs.com/zhaof/p/8620635.html

 

 

ending ~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM