社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python转go的web开发者的新船票——Tigo框架

karldoenitz • 5 年前 • 148 次点击  
阅读 79

python转go的web开发者的新船票——Tigo框架

引言

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可以点击此处下载。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29984
 
148 次点击