日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

初识beego

發(fā)布時間:2024/1/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初识beego 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 初識beego
    • bee 工具簡介
    • bee工具的安裝
      • `new` 命令
      • `api` 命令
      • `run` 命令
      • `pack` 命令
      • `version` 命令
      • `generate` 命令
      • `migrate` 命令
      • `dockerize` 命令
    • 創(chuàng)建項目
    • 運行項目
    • 項目路由設置
    • controller 邏輯
    • model 分析
    • View 編寫
    • 靜態(tài)文件處理

初識beego

bee 工具簡介

bee 工具是一個為了協(xié)助快速開發(fā) beego 項目而創(chuàng)建的項目,通過 bee 您可以很容易的進行 beego 項目的創(chuàng)建、熱編譯、開發(fā)、測試、和部署。

bee工具的安裝

go get -u github.com/beego/bee/v2

安裝完之后,bee 可執(zhí)行文件默認存放在 $GOPATH/bin 里面,所以您需要把 $GOPATH/bin 添加到您的環(huán)境變量中,才可以進行下一步。

new 命令

new 命令是新建一個 Web 項目,我們在命令行下執(zhí)行 bee new <項目名> 就可以創(chuàng)建一個新的項目。但是注意該命令必須在 $GOPATH/src 下執(zhí)行。最后會在 $GOPATH/src 相應目錄下生成如下目錄結(jié)構(gòu)的項目:

api 命令

上面的 new 命令是用來新建 Web 項目,不過很多用戶使用 beego 來開發(fā) API 應用。所以這個 api 命令就是用來創(chuàng)建 API 應用的,執(zhí)行命令之后如下所示:

run 命令

我們在開發(fā) Go 項目的時候最大的問題是經(jīng)常需要自己手動去編譯再運行,bee run 命令是監(jiān)控 beego 的項目,通過 fsnotify監(jiān)控文件系統(tǒng)。但是注意該命令必須在 $GOPATH/src/appname 下執(zhí)行。

pack 命令

pack 目錄用來發(fā)布應用的時候打包,會把項目打包成 zip 包,這樣我們部署的時候直接把打包之后的項目上傳,解壓就可以部署了

version 命令

這個命令是動態(tài)獲取 bee、beego 和 Go 的版本,這樣一旦用戶出現(xiàn)錯誤,可以通過該命令來查看當前的版本

generate 命令

這個命令是用來自動化的生成代碼的,包含了從數(shù)據(jù)庫一鍵生成 model,還包含了 scaffold 的,通過這個命令,讓大家開發(fā)代碼不再慢

migrate 命令

這個命令是應用的數(shù)據(jù)庫遷移命令,主要是用來每次應用升級,降級的SQL管理。

dockerize 命令

這個命令可以通過生成Dockerfile文件來實現(xiàn)docker化你的應用。

例子:
生成一個以1.6.4版本Go環(huán)境為基礎鏡像的Dockerfile,并暴露9000端口:

$ bee dockerize -image="library/golang:1.6.4" -expose=9000 ______ | ___ \ | |_/ / ___ ___ | ___ \ / _ \ / _ \ | |_/ /| __/| __/ \____/ \___| \___| v1.6.2 2016/12/26 22:34:54 INFO ? 0001 Generating Dockerfile... 2016/12/26 22:34:54 SUCCESS ? 0002 Dockerfile generated.

更多幫助信息可執(zhí)行bee help dockerize

創(chuàng)建項目

bee new quickstart

通過一個簡單的命令就創(chuàng)建了一個 beego 項目。他的目錄結(jié)構(gòu)如下所示

quickstart |-- conf | `-- app.conf |-- controllers | `-- default.go |-- main.go |-- models |-- routers | `-- router.go |-- static | |-- css | |-- img | `-- js |-- tests | `-- default_test.go `-- views`-- index.tpl

從目錄結(jié)構(gòu)中我們也可以看出來這是一個典型的 MVC 架構(gòu)的應用,main.go 是入口文件。

運行項目

beego 項目創(chuàng)建之后,我們還需要初始化go.mod文件。進入目錄之后,使用go mod init初始化模塊依賴。

接著我們就開始運行項目,首先進入創(chuàng)建的項目,我們使用 bee run 來運行該項目,這樣就可以做到熱編譯的效果:

cd quickstartbee run

項目路由設置

前面我們已經(jīng)創(chuàng)建了 beego 項目,而且我們也看到它已經(jīng)運行起來了,那么是如何運行起來的呢?讓我們從入口文件先分析起來吧:

package mainimport (_ "quickstart/routers""github.com/beego/beego/v2/server/web" )func main() {web.Run() }

我們看到 main 函數(shù)是入口函數(shù),但是我們知道 Go 的執(zhí)行過程是如下圖所示的方式:

這里我們就看到了我們引入了一個包 _ "quickstart/routers",這個包只引入執(zhí)行了里面的 init 函數(shù),那么讓我們看看這個里面做了什么事情:

package routersimport ("quickstart/controllers""github.com/beego/beego/v2/server/web" )func init() {web.Router("/", &controllers.MainController{}) }

路由包里面我們看到執(zhí)行了路由注冊 web.Router, 這個函數(shù)的功能是映射 URL 到 controller,第一個參數(shù)是 URL (用戶請求的地址),這里我們注冊的是 /,也就是我們訪問的不帶任何參數(shù)的 URL,第二個參數(shù)是對應的 Controller,也就是我們即將把請求分發(fā)到那個控制器來執(zhí)行相應的邏輯,我們可以執(zhí)行類似的方式注冊如下路由:

web.Router("/user", &controllers.UserController{})

web.Run 執(zhí)行之后,我們看到的效果好像只是監(jiān)聽服務端口這個過程,但是它內(nèi)部做了很多事情:

  • 解析配置文件

    beego 會自動解析在 conf 目錄下面的配置文件 app.conf,通過修改配置文件相關(guān)的屬性,我們可以定義:開啟的端口,是否開啟 session,應用名稱等信息。

  • 執(zhí)行用戶的 hookfunc

    beego 會執(zhí)行用戶注冊的 hookfunc,默認的已經(jīng)存在了注冊 mime,用戶可以通過函數(shù) AddAPPStartHook 注冊自己的啟動函數(shù)。

  • 是否開啟 session

    會根據(jù)上面配置文件的分析之后判斷是否開啟 session,如果開啟的話就初始化全局的 session。

  • 是否編譯模板

    beego 會在啟動的時候根據(jù)配置把 views 目錄下的所有模板進行預編譯,然后存在 map 里面,這樣可以有效的提高模板運行的效率,無需進行多次編譯。

  • 是否開啟文檔功能

    根據(jù) EnableDocs 配置判斷是否開啟內(nèi)置的文檔路由功能

  • 是否啟動管理模塊

    beego 目前做了一個很酷的模塊,應用內(nèi)監(jiān)控模塊,會在 8088 端口做一個內(nèi)部監(jiān)聽,我們可以通過這個端口查詢到 QPS、CPU、內(nèi)存、GC、goroutine、thread 等統(tǒng)計信息。

  • 監(jiān)聽服務端口

    這是最后一步也就是我們看到的訪問 8080 看到的網(wǎng)頁端口,內(nèi)部其實調(diào)用了 ListenAndServe,充分利用了 goroutine 的優(yōu)勢

controller 邏輯

前面我們了解了如何把用戶的請求分發(fā)到控制器,這小節(jié)我們就介紹大家如何來寫控制器,首先我們還是從源碼分析入手:

package controllersimport ("github.com/beego/beego/v2/server/web" )type MainController struct {web.Controller }func (this *MainController) Get() {this.Data["Website"] = "beego.vip"this.Data["Email"] = "astaxie@gmail.com"this.TplName = "index.tpl" }

上面的代碼顯示首先我們聲明了一個控制器 MainController,這個控制器里面組合了 web.Controller,這就是 Go 的組合方式,也就是 MainController 自動擁有了所有 web.Controller 的方法。

而 web.Controller 擁有很多方法,其中包括 Init、Prepare、Post、Get、Delete、Head 等方法。我們可以通過重寫的方式來實現(xiàn)這些方法,而我們上面的代碼就是重寫了 Get 方法。

model 分析

我們知道 Web 應用中我們用的最多的就是數(shù)據(jù)庫操作,而 model 層一般用來做這些操作,我們的 bee new 例子不存在 Model 的演示,但是 bee api 應用中存在 model 的應用。說的簡單一點,如果您的應用足夠簡單,那么 Controller 可以處理一切的邏輯,如果您的邏輯里面存在著可以復用的東西,那么就抽取出來變成一個模塊。因此 Model 就是逐步抽象的過程,一般我們會在 Model 里面處理一些數(shù)據(jù)讀取,如下是一個日志分析應用中的代碼片段:

package modelsimport ("path/filepath""strings" )var (NotPV []string = []string{"css", "js", "class", "gif", "jpg", "jpeg", "png", "bmp", "ico", "rss", "xml", "swf"} )const big = 0xFFFFFFfunc LogPV(urls string) bool {ext := filepath.Ext(urls)if ext == "" {return true}for _, v := range NotPV {if v == strings.ToLower(ext) {return false}}return true }

所以如果您的應用足夠簡單,那么就不需要 Model 了;如果你的模塊開始多了,需要復用,需要邏輯分離了,那么 Model 是必不可少的。

View 編寫

在前面編寫 Controller 的時候,我們在 Get 里面寫過這樣的語句 this.TplName = "index.tpl",設置顯示的模板文件,默認支持 tpl 和 html 的后綴名,如果想設置其他后綴你可以調(diào)用 beego.AddTemplateExt 接口設置,那么模板如何來顯示相應的數(shù)據(jù)呢?beego 采用了 Go 語言默認的模板引擎,所以和 Go 的模板語法一樣,Go 模板的詳細使用方法請參考《Go Web 編程》模板使用指南

<!DOCTYPE html><html><head><title>Beego</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><header class="hero-unit" style="background-color:#A9F16C"><div class="container"><div class="row"><div class="hero-text"><h1>Welcome to Beego!</h1><p class="description">Beego is a simple & powerful Go web framework which is inspired by tornado and sinatra.<br />Official website: <a href="http://{{.Website}}">{{.Website}}</a><br />Contact me: {{.Email}}</p></div></div></div></header></body> </html>

我們在 Controller 里面把數(shù)據(jù)賦值給了 data(map 類型),然后我們在模板中就直接通過 key 訪問 .Website 和 .Email 。這樣就做到了數(shù)據(jù)的輸出。接下來我們講解如何讓靜態(tài)文件輸出。

靜態(tài)文件處理

前面我們介紹了如何輸出靜態(tài)頁面,但是我們的網(wǎng)頁往往包含了很多的靜態(tài)文件,包括圖片、JS、CSS 等,剛才創(chuàng)建的應用里面就創(chuàng)建了如下目錄:

├── static│ ├── css│ ├── img│ └── js

beego 默認注冊了 static 目錄為靜態(tài)處理的目錄,注冊樣式:URL 前綴和映射的目錄(在/main.go文件中web.Run()之前加入):

StaticDir["/static"] = "static"

用戶可以設置多個靜態(tài)文件處理目錄,例如你有多個文件下載目錄 download1、download2,你可以這樣映射(在 /main.go 文件中 web.Run() 之前加入):

web.SetStaticPath("/down1", "download1") web.SetStaticPath("/down2", "download2")

這樣用戶訪問 URL http://localhost:8080/down1/123.txt 則會請求 download1 目錄下的 123.txt 文件。

總結(jié)

以上是生活随笔為你收集整理的初识beego的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。