polaris: session和middleware的支持

原由

polaris虽然是模仿tornado开发,但我以为做为一个go的web框架,还须要提供一些额外的扩展支持。git

polaris如今已经支持session以及middleware,主要参加django。github

polaris对于这些额外功能的支持,采起的是注册 + json配置驱动的方式。这个跟go的database/sql有点相似,任何模块都提供一套相似以下的接口:web

type Obj interface {

}

type Driver interface{
    Open(jsonConfig json.RawMessage) (Obj, error)
}

func Register(name string, driver Driver) error
func Open(name string, jsonConfig json.RawMessage) (Obj, error)

若是咱们须要自定义功能,只须要实现本身的driver以及对应的obj,而后Register进去,后续就能够经过Open直接使用了。redis

对于每一个模块的配置,由于polaris的总体配置是json,因此我也强制要求参数是json格式的,也就是json.RawMessage,各个模块自行进行Unmarshal处理。sql

session

对于一个session对象,无非就是Set,Get,Delete等,polaris须要关心的是这个session对应的store。store能够理解为该session的持久化保存位置,能够是db,redis,cookie或者memory。django

polaris提供的store接口以下:json

type Store interface {
    //get a session by id
    //if no session exist, regenerate another id to new a session
    Get(id string) (*Session, error)

    //delete session from store
    Delete(*Session) error

    //Save session to stroe
    Save(*Session) error
}

type Driver interface {
    Open(jsonConfig json.RawMessage) (Store, error)
}

现阶段,只提供了redis的支持,这里特别说明一下,我是在如今才知道redis有一个setex命令,想一想之前常常用set + expire来设置一个key以及超时,想一想都汗颜。restful

对于session的持久化,polaris提供了codec的接口,外部能够注册本身的序列化方式,同时在相应的store里面实现。对于一个codec,接口以下:cookie

//codec for session encode and decode
type Codec interface {
    Encode(values map[interface{}]interface{}) ([]byte, error)
    Decode(buf []byte) (map[interface{}]interface{}, error)
}

func RegisterCodec(name string, codec Codec) error
func GetCodec(name string) (Codec, error)

现阶段,polaris提供了gob方式的codec。外部经过GetCodec("gob")就能够获取到。session

middleware

polaris的middleware主要提供以下接口:

type Middleware interface {
    ProcessRequest(env *context.Env) error
    ProcessResponse(env *context.Env) error
}

context.Env是该次请求的上下文环境,对于每次http请求,polaris会首先调用middleware的ProcessRequest,在处理实际对应的restful接口,而后再调用ProcessResponse。

若是Process的时候,返回error,或者env已经finished,polaris会终止后续的process操做。这套处理流程是否合适后续在好好考量。

现阶段,polaris提供了session middleware的支持。

Todo

polaris采用注册 + json配置的方式,我以为能够很好的处理后续模块功能的添加问题,后续能够参考django等框架继续完善。

相关文章
相关标签/搜索