polaris: session和middleware的支持

起因

polaris雖然是模仿tornado開發,但我覺得作爲一個go的web框架,還需要提供一些額外的擴展支持。

polaris現在已經支持session以及middleware,主要參加django。

polaris對於這些額外功能的支持,採取的是註冊 + json配置驅動的方式。這個跟go的database/sql有點類似,任何模塊都提供一套類似如下的接口:

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直接使用了。

對於每個模塊的配置,因爲polaris的整體配置是json,所以我也強制要求參數是json格式的,也就是json.RawMessage,各個模塊自行進行Unmarshal處理。

session

對於一個session對象,無非就是Set,Get,Delete等,polaris需要關心的是這個session對應的store。store可以理解爲該session的持久化保存位置,可以是db,redis,cookie或者memory。

polaris提供的store接口如下:

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以及超時,想想都汗顏。

對於session的持久化,polaris提供了codec的接口,外部可以註冊自己的序列化方式,同時在相應的store裏面實現。對於一個codec,接口如下:

//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")就可以獲取到。

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等框架繼續完善。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章