『Golang』Martini框架入门

本文介绍golang中的优秀web开发框架martini!

Martini框架是使用Go语言作为开发语言的一个强力的快速构建模块化web应用与服务的开发框架。Martini是一个专门用来处理Web相关内容的框架,其并没有自带有关ORM或详细的分层内容。所以当我们使用Martini作为我们的开发框架时,我们还需要选取适合的ORM等其他包。

安装

go get github.com/codegangsta/martini

使用

我们可以使用如下的代码来测试我们安装的包是否是可用的:

// server.go

package main

import "github.com/codegangsta/martini"

func main() {
  m := martini.Classic()
  m.Get("/", func() string {
    return "Hello world!"
  })
  m.Run()
}

在命令行中输入下面的命令运行上面的代码:

go run server.go

接下来我们就可以使用如下的网址访问我们的应用:

http://localhost:3000

说明:

  1. m := martini.Classic()创建一个典型的martini实例。
  2. m.Get("/", func() string { ... })接收对\的GET方法请求,第二个参数是对一请求的处理方法。
  3. m.Run()运行服务器。

API

(主要内容翻译自官方文档)

常量
下面的常量定义用于指定应用所处的环境:

const (
    Dev  string = "development"
    Prod string = "production"
    Test string = "test"
)

变量

我们使用如下的变量来控制应用所处的环境:

var Env = Dev

type BeforeFunc

BeforeFunc类型的方法在ResponseWriter方法被生效前调用。

type BeforeFunc func(ResponseWriter)

如:

BeforeFunc XXX(req ResponseWriter){
    // ...
}

type ClassicMartini

带有典型方法的Martini实例类型。

type ClassicMartini struct {
    *Martini
    Router
}

func Classic() *ClassicMartini

我们可以使用这个方法创建一个典型的Martini实例。然后我们就可以使用这个Martini实例来进行应用的管理:

func Classic() *ClassicMartini

type Context

Request请求的上下文内容。

type Context interface {
    inject.Injector
    // Next is an optional function that Middleware Handlers can call to yield the until after
    // the other Handlers have been executed. This works really well for any operations that must
    // happen after an http request
    Next()
    // Written returns whether or not the response for this context has been written.
    Written() bool
}

### type Handler

Handler可以是任意的方法,Marniti会尝试注入服务到Handler方法的参数列表中。如果不能成功注入的话,Marniti会panic。

type Handler interface{}
```

func Logger() Handler

Logger返回一个中间件处理器,用于记录request的请求输入与响应输出。

func Logger() Handler

func Recovery() Handler

Recovery返回一个中间件,用于修复错误并在可能的情况下返回一个500给客户端。在开发模式的时候,Recovery会将错误信息输出为HTML页面。

func Recovery() Handler

func Static(directory string, staticOpt ...StaticOptions) Handler

Static返回一个中间件处理器,用于服务给定目录的静态文件。

func Static(directory string, staticOpt ...StaticOptions) Handler

type Martini

Martini实例是整个Web应用的顶层。inject.Injector方法在全局层面上映射服务。

type Martini struct {
    inject.Injector
    // contains filtered or unexported fields
}

func New() *Martini

创建包含全部功能的Martini实例。

func New() *Martini

func (m *Martini) Action(handler Handler)

Action方法在所有的Martini中间件都被引入之后调用。在ClassicMartini中,是martini.Router。

func (m *Martini) Action(handler Handler)

func (m *Martini) Handlers(handlers ...Handler)

设置给定的Handler处理方法栈。当处理器中存在不可调用的方法的时候,会产生异常。

func (m *Martini) Handlers(handlers ...Handler)

func (m *Martini) Run()

获取http包中的server.Listening。默认使用os.GetEnv("PORT")或3000作为访问端口号.

func (m *Martini) Run()

func (m Martini) ServeHTTP(res http.ResponseWriter, req http.Request)

ServeHTTP是Martini实例的入口。一般用于控制HTTP服务器。

func (m *Martini) ServeHTTP(res http.ResponseWriter, req *http.Request)

func (m *Martini) Use(handler Handler)

将一个Handle处理方法添加到处理栈中。当处理方法不可用的时候会出现异常。

func (m *Martini) Use(handler Handler)

type Params

已命名路由的键值对映射。一个martini.Params可以被注入到任意的路由处理方法中。

type Params map[string]string

type ResponseWriter

ResponseWriter对http.ResponseWriter进行包装,它提供有关响应的扩展信息。如果以方法的形式调用,推荐使用这个中间件处理器来包装一个响应。

type ResponseWriter interface {
    http.ResponseWriter
    http.Flusher
    // Status returns the status code of the response or 0 if the response has not been written.
    Status() int
    // Written returns whether or not the ResponseWriter has been written.
    Written() bool
    // Size returns the size of the response body.
    Size() int
    // Before allows for a function to be called before the ResponseWriter has been written to. This is
    // useful for setting headers or any other operations that must happen before a response has been written.
    Before(BeforeFunc)
}

func NewResponseWriter(rw http.ResponseWriter) ResponseWriter

创建一个包装http.ResponseWriter的ResponseWriter类型实例。

func NewResponseWriter(rw http.ResponseWriter) ResponseWriter

type ReturnHandler

ReturnHandler是Martini提供的用于路由处理并返回内容的服务。ReturnHandler对于向基于值传递的ResponseWriter写入是可响应的。

type ReturnHandler func(Context, []reflect.Value)

type Route

Route是一个用于表示Martini路由层的接口。

type Route interface {
    // URLWith returns a rendering of the Route‘s url with the given string params.
    URLWith([]string) string
    Name(string)
}

type Router

Router是Martini的路由接口。提供HTTP变量、处理方法栈、依赖注入。

type Router interface {
    // Get adds a route for a HTTP GET request to the specified matching pattern.
    Get(string, ...Handler) Route
    // Patch adds a route for a HTTP PATCH request to the specified matching pattern.
    Patch(string, ...Handler) Route
    // Post adds a route for a HTTP POST request to the specified matching pattern.
    Post(string, ...Handler) Route
    // Put adds a route for a HTTP PUT request to the specified matching pattern.
    Put(string, ...Handler) Route
    // Delete adds a route for a HTTP DELETE request to the specified matching pattern.
    Delete(string, ...Handler) Route
    // Options adds a route for a HTTP OPTIONS request to the specified matching pattern.
    Options(string, ...Handler) Route
    // Head adds a route for a HTTP HEAD request to the specified matching pattern.
    Head(string, ...Handler) Route
    // Any adds a route for any HTTP method request to the specified matching pattern.
    Any(string, ...Handler) Route

    // NotFound sets the handlers that are called when a no route matches a request. Throws a basic 404 by default.
    NotFound(...Handler)

    // Handle is the entry point for routing. This is used as a martini.Handler
    Handle(http.ResponseWriter, *http.Request, Context)
}

func NewRouter() Router

创建一个路由实例。

func NewRouter() Router

type Routes

Routes是Martini路由层的辅助服务。

type Routes interface {
    // URLFor returns a rendered URL for the given route. Optional params can be passed to fulfill named parameters in the route.
    URLFor(name string, params ...interface{}) string
    // MethodsFor returns an array of methods available for the path
    MethodsFor(path string) []string
}

type StaticOptions

StaticOptions是一个为martini.Static中间件指定配置选项的结构体。

type StaticOptions struct {
    // Prefix is the optional prefix used to serve the static directory content
    Prefix string
    // SkipLogging can be used to switch log messages to *log.logger off.
    SkipLogging bool
    // IndexFile defines which file to serve as index if it exists.
    IndexFile string
}

参考

  1. 官网
  2. @Github
  3. @GoDOC
时间: 2024-11-08 20:26:18

『Golang』Martini框架入门的相关文章

Golang 的Gin框架入门教学

学习Golang差不多有一个星期时间,开始自己做点小功能,练练手. Gin 介绍 Gin 是一个 Golang 写的 web 框架,具有高性能的优点,,基于 httprouter,它提供了类似martini但更好性能(路由性能约快40倍)的API服务.官方地址:https://github.com/gin-gonic/gin 安装框架 配置好GOPATH,建议自己在GOPATH建个项目,这里我以aze.org作为项目目录. $ go get github.com/gin-gonic/gin 安装

『Golang』—— 标准库之 os

Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path string) string //取路径中的目录名部分,不含文件名 func Join(elem ...string) string //拼接字段,中间自动添加 '/' os 库: 1 ackage main 2 3 import "os" 4 import "os/exec&qu

『Python』MachineLearning机器学习入门_极小的机器学习应用

一个小知识: 有意思的是,scipy囊括了numpy的命名空间,也就是说所有np.func都可以通过sp.func等价调用. 简介: 本部分对一个互联网公司的流量进行拟合处理,学习最基本的机器学习应用. 导入包&路径设置: import os import scipy as sp import matplotlib.pyplot as plt data_dir = os.path.join( os.path.dirname(os.path.realpath(__file__)), "..

『Python』MachineLearning机器学习入门_效率对比

效率对比: 老生常谈了,不过这次用了个新的模块, 运行时间测试模块timeti: 1 import timeit 2 3 normal = timeit.timeit('sum(x*x for x in range(1000))', number=10000) 4 native_np = timeit.timeit('sum(na*na)', # 重复部分 5 setup="import numpy as np; na = np.arange(1000)", # setup只运行一次

『GoLang』函数

函数介绍 Go语言函数基本组成包括: 关键字func 函数名 参数列表 返回值 函数体 返回语句 语法如下: func 函数名(参数列表) (返回值列表) { // 函数体 return } 除了main().init()函数外,其它所有类型的函数都可以有参数与返回值 一个简单的例子: package main func main() { println("In main before calling greeting") greeting() println("In mai

『GoLang』包

可见性规则 在Go语言中,标识符必须以一个大写字母开头,这样才可以被外部包的代码所使用,这被称为导出.标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的.但是包名不管在什么情况下都必须小写. 在设计Go语言时,设计者们也希望确保它不是过于以ASCII为中心,这意味着需要从7位ASCII的范围来扩展标识符的空间. 所以Go语言标识符规定必须是Unicode定义的字母或数字,标识符是一个或多个Unicode字母和数字的序列, 标识符中的第一个字符必须是Unicode

『GoLang』面向对象

我们总结一下前面看到的:Go 没有类,而是松耦合的类型.方法对接口的实现. 面向对象语言最重要的三个方面分别是:封装,继承和多态,在 Go 中它们是怎样表现的呢? Go实现面向对象的两个关键是struct和interface,结构代替类,因为Go语言不提供类,但提供了结构体或自定义类型,方法可以被添加到结构体或自定义类型中.结构体之间可以嵌套,类似继承.而interface定义接口,实现多态性. 封装(数据隐藏) 和别的面向对象语言有 4 个或更多的访问层次相比,Go 把它简化为了 2 层: 包

Golang开发环境搭建(Notepad++、LiteIDE两种方式以及martini框架使用)

本文介绍两种Golang的开发环境一种基于notepad++.另一种基于liteide. 1.下载Golang语言的pkg:http://golangtc.com/download 直接点击安装,一路next. 2.程序员必备神器notepad++开发Golang环境很简单 一次点击:插件->Plugin Manger->Show Plugin Manger,安装插件GOnpp,重启notepad++. 新建文件命名为hello.go用notepad++打开,拷贝如下代码: package m

『TensorFlow』TFR数据预处理探究以及框架搭建

TFRecord文件书写效率对比(单线程和多线程对比) 准备工作, # Author : Hellcat # Time : 18-1-15 ''' import os os.environ["CUDA_VISIBLE_DEVICES"]="-1" ''' import os import glob import numpy as np import tensorflow as tf import matplotlib.pyplot as plt np.set_pri