mrbardia72
mrbardia72
خواندن ۳ دقیقه·۴ سال پیش

Gin Web Framework part 7

Gin Web Framework part 7
Gin Web Framework part 7

درود دوستان امروز میخوام در مورد بخش هقتم از سری مقالات فرم ورک Gin صحبت کنیم

  • فهرست بخش هقتم از این مقالهServing static files
  • Serving static files
  • Serving data from file
  • Serving data from reader
  • HTML rendering
  • Custom Template renderer
  • Custom Template Funcs

میریم واسه توضیح هر بخش

قسمت اول Serving static files

به کد های زیر دقت کنید

r.Static(&quot/assets&quot, &quot./assets&quot) r.StaricFS(&quot/more_static&quot, http.Dir(&quotmy_file_system&quot)) r.StaticFile(&quot/favicon.ico&quot, &quot./resources/favicon.ico&quot)

خط اول تابع static مسیر یا روت اصلی رو برامون براگذاری میکنه به قول معروف فایل رو از ریشه برامون بارگذاری می کند

خط دوم تابع staticfs مسیر های دیگه ای که اگه نیاز داریم رو برامون بارگذاری می کنه

خط سوم تابع staticfile برای بارگذاری فایل خاصی از مسیر خاصی می باشد.

قسمت دوم Serving data from file

func main() { router := gin.Default() router.GET(&quot/local/file&quot, func(c *gin.Context) { c.File(&quotlocal/file.go&quot) }) var fs http.FileSystem = // ... router.GET(&quot/fs/file&quot, func(c *gin.Context) { c.FileFromFS(&quotfs/file.go&quot, fs) }) }

توی خط چهارم اگر به فایلی که توی ریشه هست رو بخواهیم بفرستم باید از تابع c.file استفاده کنیم

توی خط هشت اگر ما بخوایم یه فایلی رو از یه آدرس مشخص که توی خط شیش ذکر کردیم بفرستم به روتی که توی خط هفت تعریف کردیم از این تابع filefromfs استفاده می کنیم

قسمت سوم Serving data from reader

func main() { router := gin.Default() router.GET(&quot/someDataFromReader&quot, func(c *gin.Context) { response, err := http.Get(&quothttps://raw.githubusercontent.com/gin-gonic/logo/master/color.png&quot) if err != nil || response.StatusCode != http.StatusOK { c.Status(http.StatusServiceUnavailable) return } reader := response.Body defer reader.Close() contentLength := response.ContentLength contentType := response.Header.Get(&quotContent-Type&quot) extraHeaders := map[string]string{ &quotContent-Disposition&quot: `attachment; filename=&quotgopher.png&quot`, } c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders) }) router.Run(&quot:8080&quot) }

اگر بخوایم یه سری اطلاعات رو توی هدر بنویسیم از متدی که در خط ۱۷ هست رو تعریف می کنیم شمای این متد به صورت زیر هست

func (c *Context) DataFromReader(code int, contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string) { c.Render(code, render.Reader{ Headers: extraHeaders, ContentType: contentType, ContentLength: contentLength, Reader: reader, }) }

قسمت چهارم HTML rendering

به کدهای زیر توجه کنید در ادامه توضیح خواهم داد

func main() { router := gin.Default() router.LoadHTMLGlob(&quottemplates/**/*&quot) router.GET(&quot/posts/index&quot, func(c *gin.Context) { c.HTML(http.StatusOK, &quotposts/index.tmpl&quot, gin.H{ &quottitle&quot: &quotPosts&quot, }) }) router.GET(&quot/users/index&quot, func(c *gin.Context) { c.HTML(http.StatusOK, &quotusers/index.tmpl&quot, gin.H{ &quottitle&quot: &quotUsers&quot, }) }) router.Run(&quot:8080&quot) }

خط سوم تابع loadhtmlglob مسیر فایل های tmpl و نشون میده

templates/posts/index.tmpl

{{ define &quotposts/index.tmpl&quot }} <html><h1> {{ .title }} </h1> <p>Using posts/index.tmpl</p> </html> {{ end }}

templates/users/index.tmpl

{{ define &quotusers/index.tmpl&quot }} <html><h1> {{ .title }} </h1> <p>Using users/index.tmpl</p> </html> {{ end }}

خط ۵ و ۱۰ فایل مدنظر ما رو نمایش میده با استفاده از متد c.html و ۶ و ۱۱ ما یه رشته رو داریم میفرستیم داخل اون tmpl های خودمون و برای نمایش اون مقدار داخل فایل tmpl باید از {{.namefiled}} استفاده کنیم

قسمت پنجم Custom Template renderer

همچنین می توانید از کتابخانه "html/template" به صورت زیر استفاده کنید

import &quothtml/template&quot func main() { router := gin.Default() html := template.Must(template.ParseFiles(&quotfile1&quot, &quotfile2&quot)) router.SetHTMLTemplate(html) router.Run(&quot:8080&quot) }

قسمت شیشم Custom Template Funcs

اگر بخوایم نوع فرمت نمایش توی خروجی رو سفارشی کنیم به صورت زیر یعنی فرض کنید که یه تاریخ زمانی دارید ولی فقط میخواید تاریخ رو نشون بدید

main.go

import ( &quotfmt&quot &quothtml/template&quot &quotnet/http&quot &quottime&quot &quotgithub.com/gin-gonic/gin&quot ) func formatAsDate(t time.Time) string { year, month, day := t.Date() return fmt.Sprintf(&quot%d d/ d&quot, year, month, day) } func main() { router := gin.Default() router.Delims(&quot{[{&quot, &quot}]}&quot) router.SetFuncMap(template.FuncMap{ &quotformatAsDate&quot: formatAsDate, }) router.LoadHTMLFiles(&quot./testdata/template/raw.tmpl&quot) router.GET(&quot/raw&quot, func(c *gin.Context) { c.HTML(http.StatusOK, &quotraw.tmpl&quot, gin.H{ &quotnow&quot: time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC), }) }) router.Run(&quot:8080&quot) }

raw.tmpl

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

Result:

Date: 2017/07/01

گوگولنگgogolang
Go Developer(gopher-academy.ir)
شاید از این پست‌ها خوشتان بیاید