python轉go的web開發者的新船票——Tigo框架

karldoenitz發表於2019-03-19

引言

Go語言目前比較火的web框架有gin、mux等。但是gin、mux等的程式碼風格讓很多曾經使用Tornado框架的開發人員感覺不適應。這裡給大家帶來了一個新的框架——Tigo框架,讓Python/Tornado轉Go的開發者又多了一條可選擇的道路。

首先我們看一下Tornado框架的一個Demo:

# -*- coding: utf-8 -*-

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, Demo!")

urls = [
    (r"/", MainHandler),
]

if __name__ == "__main__":
    app = tornado.web.Application(urls)
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()
複製程式碼

接下來再看一下Tigo的Demo:

package main

import "github.com/karldoenitz/Tigo/TigoWeb"

type DemoHandler struct {
    TigoWeb.BaseHandler
}

func (demoHandler *DemoHandler) Get() {
    demoHandler.ResponseAsText("Hello, Demo!")
}

var urls = []TigoWeb.Router{
    {"/demo", &DemoHandler{}, nil},
}

func main() {
    application := TigoWeb.Application{IPAddress: "0.0.0.0", Port: 8888, UrlRouters: urls}
    application.Run()
}
複製程式碼

二者的程式碼風格還是比較相近的。

Tigo的基本資訊及安裝

Tigo是一款Go(Golang)語言開發的web應用框架,主要設計靈感來源於Tornado框架,結合了Go本身的一些特性(interface、struct嵌入等)而設計的一個框架。
Tigo框架的首頁:點選此處
Tigo框架的專案地址:點選此處
Tigo框架的API文件:點選此處
安裝方法:

go get github.com/karldoenitz/Tigo/...
複製程式碼

Tigo主要包含TigoWebrequestbindinglogger四個包,其中TigoWeb是Tigo框架的核心包,搭建服務主要依靠此包;request包是一個httpclient工具包,用來傳送http請求;binding包是用來對json以及form進行校驗的工具包;logger包則是用來記錄log的工具包。

Tigo工具包使用簡介

TigoWeb包的使用

首先來看一下Tigo一個服務所包含的基本程式碼塊:ApplicationHandlerUrlRouter;
一個Application例項就是一個服務,一個Handler就是一個Controller,UrlRouter將url與handler進行繫結。

服務搭建

我們寫一個簡單的示例:
定義一個handler,在handler中實現一個get方法,用來響應HTTP的get請求方式;

import "github.com/karldoenitz/Tigo/TigoWeb"

type DemoHandler struct {
    TigoWeb.BaseHandler
}

func (demoHandler *DemoHandler) Get() {
    demoHandler.ResponseAsText("Hello, Demo!")
}
複製程式碼

接下來寫一個路由對映;

var urls = []TigoWeb.Router{
    {"/demo", &DemoHandler{}, nil},
}
複製程式碼

最後我們寫一個main方法,初始化一個Application例項,並執行該例項;

func main() {
    application := TigoWeb.Application{IPAddress: "0.0.0.0", Port: 8888, UrlRouters: urls}
    application.Run()
}
複製程式碼

BaseHandler

BaseHandler是所有handler的基類,cookie操作、http header操作、http上下文操作等方法都在此結構體中實現,開發者只要繼承這個handler,就可以使用這裡面的方法。

binding包的使用

目前binding支援json和form的例項化校驗,後續將推出url引數的例項化校驗。

json及form的校驗

我們定義一個結構體UserInfo,具體如下:

type Person struct {
    Name   string `json:"name" required:"true"`
    Age    int    `json:"age" required:"true" default:"18"`
    Mobile string `json:"mobile" required:"true" regex:"^1([38][0-9]|14[57]|5[^4])\\d{8}$"`
    Info   string `json:"info" required:"false"`
}
複製程式碼

當tag中required為true的時候,將會對此欄位進行校驗,否則略過;default表示預設值,當此欄位必須,並且json/form中沒有值的時候,就會採用此預設值;regex則表示正則匹配,如果該欄位的值滿足正則匹配,則認為該欄位合法,否則校驗失敗。
例如:

// 我們向服務傳送一個json,資料格式如下所示
{
    "name": "張三",
    "mobile": "13746588129"
}
複製程式碼

校驗結果如下:

// 我們將json校驗之後的結果轉為json列印出來
{
    "name": "張三",
    "age": 18,
    "mobile": "13746588129",
    "info": ""
}
複製程式碼

當然,TigoWeb.Basehandler中封裝了CheckJsonBindingCheckFormBindingCheckParamBinding三個內建方法進行json或form的校驗。

request包的使用

request包是用來傳送http請求的工具包,

傳送http請求

使用request包傳送http請求非常簡單,如果你使用過Python的requests模組,那麼Tigo的request包極易上手。
示例1:

// 傳送Post請求示例
import "github.com/karldoenitz/Tigo/request"

func main() {
    headers := map[string]string{
        "Content-Type": "application/x-www-form-urlencoded",
    }
    postData := map[string]interface{}{
        "chlid": "news_news_bj",
    }
    response, err := request.Post("https://test.hosts.com/api/get_info_list?cachedCount=0", postData, headers)
    if err != nil {
        fmt.Println(err.Error())
    }
    contentStr := response.ToContentStr()
    fmt.Println(contentStr)
}
複製程式碼

示例2:

// 傳送get請求
import "github.com/karldoenitz/Tigo/request"

func main() {
    response, err := request.Get("https://demo.host.com/api/detail?id=773947310848622080")
    if err != nil {
        fmt.Println(err.Error())
    }
    contentStr := response.ToContentStr()
    result := struct {
        Code int    `json:"code"`
        Msg  string `json:"msg"`
    }{}
    json.Unmarshal(response.Content, &result)
    fmt.Println(result.Code)
    fmt.Println(result.Msg)
    fmt.Println(contentStr)
}
複製程式碼

logger包的使用

logger的模組的使用非常簡單,可以通過json檔案或者yaml檔案配置,示例如下:

{
  "cookie": "TencentCode",
  "ip": "0.0.0.0",
  "port": 8080,
  "log": {
    "trace": "/Users/karllee/Desktop/trace.log",    // 此檔案儲存trace跟蹤日誌
    "info": "/Users/karllee/Desktop/run-info.log",  // 此檔案儲存info日誌
    "warning": "/Users/karllee/Desktop/run.log",    // 將warning和error日誌都寫入run.log
    "error": "/Users/karllee/Desktop/run.log",
    "time_roll": "H*2"                              // 每2小時切分一次log日誌
  }
}
複製程式碼

配置檔案寫好之後,只需要在初始化Application例項的時候指定配置檔案地址即可,例如:

application := TigoWeb.Application{
    ...
    ConfigPath: "./configuration.json",  // 配置檔案的絕對路徑或相對路徑
}
複製程式碼

結語

Tigo更詳細的功能及文件請檢視github專案主頁
Demo可以點選此處下載。

相關文章