成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang GinWeb框架7-靜態文件/模板渲染

開發 前端
本文接著上文(Golang GinWeb框架6-綁定請求字符串/URI/請求頭/復選框/表單類型)繼續探索GinWeb框架

[[355468]]

 簡介

本文接著上文(Golang GinWeb框架6-綁定請求字符串/URI/請求頭/復選框/表單類型)繼續探索GinWeb框架

靜態文件服務

  1. package main 
  2.  
  3. import ( 
  4.   "github.com/gin-gonic/gin" 
  5.   "log" 
  6.   "net/http" 
  7.   "os" 
  8.  
  9. func main() { 
  10.   router := gin.Default() 
  11.   cwd, _ := os.Getwd()  //獲取當前文件目錄 
  12.   log.Printf("當前項目路徑:%s", cwd) 
  13.   router.Static("/static", cwd) //提供靜態文件服務器, 第一個參數為相對路徑,第二個參數為根路徑, 這個路徑一般放置css,js,fonts等靜態文件,前端html中采用/static/js/xxx或/static/css/xxx等相對路徑的方式引用 
  14.   router.StaticFS("/more_static", http.Dir("./")) //將本地文件樹結構映射到前端, 通過瀏覽器可以訪問本地文件系統, 模擬訪問:http://localhost:8080/more_static 
  15.   router.StaticFile("/logo.png""./resources/logo.png")  //StaticFile提供單靜態單文件服務, 模擬訪問:http://localhost:8080/log.png 
  16.  
  17.   // Listen and serve on 0.0.0.0:8080 
  18.   router.Run(":8080"

返回文件數據

  1. package main 
  2.  
  3. import ( 
  4.   "github.com/gin-contrib/cors" 
  5.   "github.com/gin-gonic/gin" 
  6.   "net/http" 
  7.  
  8. func main() { 
  9.   router := gin.Default() 
  10.   router.Use(cors.Default()) 
  11.  
  12.   router.GET("/local/file", func(c *gin.Context) { 
  13.     c.File("./main.go"
  14.   }) 
  15.  
  16.  
  17.   // A FileSystem implements access to a collection of named files. 
  18.   // The elements in a file path are separated by slash ('/', U+002F) 
  19.   // characters, regardless of host operating system convention. 
  20.   // FileSystem接口, 要求實現文件的訪問的方法, 提供文件訪問服務根路徑的HTTP處理器 
  21.   var fs http.FileSystem = http.Dir("./")  //將本地目錄作為文件服務根路徑 
  22.   router.GET("/fs/file", func(c *gin.Context) { 
  23.     c.FileFromFS("main.go", fs)  //將文件服務系統下的文件數據返回 
  24.   }) 
  25.   router.Run(":8080"
  26. /* 
  27. 模擬訪問文件數據: 
  28. curl http://localhost:8080/local/file 
  29.  
  30. 模擬訪問文件系統下的文件數據: 
  31. curl http://localhost:8080/fs/file 
  32. */ 

用文件讀出器提供文件數據服務

  1. package main 
  2.  
  3. import ( 
  4.   "github.com/gin-gonic/gin" 
  5.   "net/http" 
  6.  
  7. func main() { 
  8.   router := gin.Default() 
  9.   router.GET("/someDataFromReader", func(c *gin.Context) { 
  10.     response, err := http.Get("https://raw.githubusercontent.com/gin-gonic/logo/master/color.png"
  11.     if err != nil || response.StatusCode != http.StatusOK {  //請求鏈接中的文件出現錯誤時, 直接返回服務不可用 
  12.       c.Status(http.StatusServiceUnavailable) 
  13.       return 
  14.     } 
  15.  
  16.     reader := response.Body  //用響應體內容構造一個文件讀出器 
  17.     defer reader.Close() 
  18.     contentLength := response.ContentLength 
  19.     contentType := response.Header.Get("Content-Type"
  20.  
  21.     extraHeaders := map[string]string{ 
  22.       "Content-Disposition": `attachment; filename="gopher.png"`, 
  23.     } 
  24.     // DataFromReader writes the specified reader into the body stream and updates the HTTP code. 
  25.     // func (c *Context) DataFromReader(code int, contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string) {} 
  26.     // DataFromReader方法將指定的讀出器reader中的內容, 寫入http響應體流中, 并更新響應碼, 響應頭信息等 
  27.     c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders) 
  28.   }) 
  29.   router.Run(":8080"
  30. /* 
  31. 模擬訪問: 
  32. curl http://localhost:8080/someDataFromReader 
  33. */ 

HTML渲染

使用LoadHTMLGlob()方法或LoadHTMLFiles()方法

  1. package main 
  2.  
  3. import ( 
  4.   "github.com/gin-gonic/gin" 
  5.   "net/http" 
  6.  
  7. func main() { 
  8.   router := gin.Default() 
  9.   //LoadHTMLGlob方法以glob模式加載匹配的HTML文件, 并與HTML渲染器結合 
  10.   router.LoadHTMLGlob("templates/*"
  11.   //router.LoadHTMLFiles("templates/template1.html""templates/template2.html"
  12.   router.GET("/index", func(c *gin.Context) { 
  13.     //HTML方法設置響應碼, 模板文件名, 渲染替換模板中的值, 設置響應內容類型Content-Type "text/html" 
  14.     c.HTML(http.StatusOK, "index.tmpl", gin.H{ 
  15.       "title""Main website"
  16.     }) 
  17.   }) 
  18.   router.Run(":8080"
  19. /* 
  20. 模擬測試: 
  21. curl http://localhost:8080/index 
  22. */ 

增加模板文件, templates/index.tmpl

  1. <html> 
  2.   <h1> 
  3.     {{ .title }} 
  4.   </h1> 
  5. </html> 

 使用不同文件夾下的相同文件名的模板文件

  1. func main() { 
  2.   router := gin.Default() 
  3.   router.LoadHTMLGlob("templates/**/*"
  4.   router.GET("/posts/index", func(c *gin.Context) { 
  5.     c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{ 
  6.       "title""Posts"
  7.     }) 
  8.   }) 
  9.   router.GET("/users/index", func(c *gin.Context) { 
  10.     c.HTML(http.StatusOK, "users/index.tmpl", gin.H{ 
  11.       "title""Users"
  12.     }) 
  13.   }) 
  14.   router.Run(":8080"

posts目錄下添加模板文件, templates/posts/index.tmpl

  1. {{ define "posts/index.tmpl" }} 
  2. <html><h1> 
  3.   {{ .title }} 
  4. </h1> 
  5. <p>Using posts/index.tmpl</p> 
  6. </html> 
  7. {{ end }} 

 users目錄下添加模板文件, templates/users/index.tmpl

  1. {{ define "users/index.tmpl" }} 
  2. <html><h1> 
  3.   {{ .title }} 
  4. </h1> 
  5. <p>Using users/index.tmpl</p> 
  6. </html> 
  7. {{ end }} 

 自定義模板渲染器

你也可以使用你自定義的HTML模板渲染器, 需要自定義模板文件file1, file2等 

  1. package main 
  2.  
  3. import ( 
  4.   "github.com/gin-gonic/gin" 
  5.   "html/template" 
  6.   "net/http" 
  7.  
  8. func main() { 
  9.   router := gin.Default() 
  10.   //template.ParseFiles(文件1,文件2...)創建一個模板對象, 然后解析一組模板,使用文件名作為模板的名字 
  11.   // Must方法將模板和錯誤進行包裹, 返回模板的內存地址 一般用于變量初始化,比如:var t = template.Must(template.New("name").Parse("html")) 
  12.   html := template.Must(template.ParseFiles("file1""file2")) 
  13.   router.SetHTMLTemplate(html) //關聯模板和HTML渲染器 
  14.  
  15.   router.GET("/index", func(c *gin.Context) { 
  16.     //HTML方法設置響應碼, 模板文件名, 渲染替換模板中的值, 設置響應內容類型Content-Type "text/html" 
  17.     c.HTML(http.StatusOK, "file1", gin.H{ 
  18.       "title""Main website"
  19.     }) 
  20.   }) 
  21.   router.Run(":8080"

自定義分隔符

你可以自定義分隔符, 模板中默認的分隔符是{{ }}, 我們也可以修改, 比如下面增加一對中括號

  1. r := gin.Default() 
  2. r.Delims("{[{""}]}"
  3. r.LoadHTMLGlob("/path/to/templates"

自定義模板方法

詳見 示例代碼.

模板中與后端都定義好模板方法, 模板渲染時執行該方法, 類似過濾器方法, 比如時間格式化操作

  1. package main 
  2.  
  3. import ( 
  4.   "fmt" 
  5.   "html/template" 
  6.   "net/http" 
  7.   "time" 
  8.  
  9.   "github.com/gin-gonic/gin" 
  10.  
  11. func formatAsDate(t time.Time) string { 
  12.   yearmonthday := t.Date()  //Date方法返回年,月,日 
  13.   return fmt.Sprintf("%d%02d/%02d"yearmonthday)  //格式化時間 
  14.  
  15. func main() { 
  16.   router := gin.Default() 
  17.   router.Delims("{[{""}]}") //自定義模板中的左右分隔符 
  18.   //SetFuncMap方法用給定的template.FuncMap設置到Gin引擎上, 后面模板渲染時會調用同名方法 
  19.   //FuncMap是一個map,鍵名關聯方法名, 鍵值關聯方法, 每個方法必須返回一個值, 或者返回兩個值,其中第二個是error類型 
  20.   router.SetFuncMap(template.FuncMap{ 
  21.     "formatAsDate": formatAsDate, 
  22.   }) 
  23.   router.LoadHTMLFiles("./testdata/template/raw.tmpl") //加載單個模板文件并與HTML渲染器關聯 
  24.  
  25.   router.GET("/raw", func(c *gin.Context) { 
  26.     c.HTML(http.StatusOK, "raw.tmpl", gin.H{ 
  27.       "now"time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC), 
  28.     }) 
  29.   }) 
  30.  
  31.   router.Run(":8080"
  32.  
  33. /* 
  34. 模擬測試: 
  35. curl http://localhost:8080/raw 
  36. */ 

定義模板文件: raw.tmpl

  1. Date: {[{.now | formatAsDate}]} 

時間格式化結果:

  1. Date: 2017/07/01 

多個模板

Gin默認只使用一個html.Template模板引擎, 也可以參考多模板渲染器使用類似Go1.6的塊級模板block template功能.

模板相關詳情請參考官方template包

參考文檔

Gin官方倉庫:https://github.com/gin-gonic/gin

 

責任編輯:姜華 來源: 云原生云
相關推薦

2020-12-08 12:05:48

Golang GinW框架HTTPS

2020-12-02 11:18:28

Golang GinW

2020-11-23 10:48:39

Golang GinW

2020-11-26 10:08:17

Golang GinW

2020-12-10 10:22:48

GinWeb中間件HTTPS

2020-11-25 09:18:15

Golang GinW

2020-11-27 07:54:53

Golang GinW

2020-11-25 09:10:39

Golang GinW

2023-10-22 20:20:37

FiberGo

2020-09-04 10:14:02

Linux驅動7內核

2017-07-25 14:07:14

前端Vue模板渲染

2019-10-14 15:34:10

Web 開發框架

2024-04-02 09:55:36

GolangColly開發者

2024-09-04 08:46:38

2011-05-18 14:07:59

XSL

2021-05-12 08:54:56

FastAP web 框架數據庫操作

2024-11-07 11:46:41

2022-01-21 08:21:48

前端vdom渲染

2022-03-30 18:18:33

GolangTiDB數據庫

2013-07-18 13:30:11

Metro微軟
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美999 | 欧美一区二区三区在线看 | 超黄视频网站 | 欧美嘿咻| 国产精品我不卡 | 国产中文视频 | 国产精品视频网 | 国产不卡在线观看 | 久久久久国产一区二区三区四区 | h视频在线播放 | 水蜜桃久久夜色精品一区 | h片在线观看网站 | 亚洲v日韩v综合v精品v | 久草热线 | 一区二区视频免费观看 | 精品国产久 | 日韩精品成人网 | 久久精品欧美一区二区三区不卡 | 日韩精品无码一区二区三区 | 午夜精品久久久久久久星辰影院 | 色婷婷精品久久二区二区蜜臂av | 成年人视频在线免费观看 | 久久高清 | 国产高清在线精品一区二区三区 | 日韩一级二级片 | 欧美精品久久久久 | 久久精品女人天堂av | 理论片午午伦夜理片影院 | 亚洲国产精品人人爽夜夜爽 | 国产精品久久国产精品99 gif | 久久99久久98精品免观看软件 | 性欧美hd| 欧美a级成人淫片免费看 | 国产久 | 日韩性生活网 | 亚洲电影一区二区三区 | 久久久精品国产 | 久久免费精品视频 | 日韩欧美三级电影在线观看 | 电影午夜精品一区二区三区 | 日韩色视频 |