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等框架继续完善。
polaris: session和middleware的支持的更多相关文章
- Session配置之WebApi支持
1.在WebApiConfig中建立建立HttpControllerHandler和HttpControllerRouteHandler 并覆写它 public class SessionRouteH ...
- polaris: 一个用go实现的支持restful的web框架
介绍 polaris是一个用go实现的支持restful的web框架,主要参考tornado进行设计. 虽然在go里面搭建一个http server非常的简单,这里强烈推荐gorilla,但并没有很好 ...
- thinkphp session支持
系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成,该函数可以完成Session的设置.获取.删除和管理操作. session初始化设置 如果session ...
- django的cookie和session以及内置信号、缓存
cookie和session cookie和session的作用: cookie和session都记录了客户端的某种状态,用来跟踪用户访问网站的整个回话.两者最大的区别是cookie的信息是存放在浏览 ...
- python Django session/cookie
一, Cookie #cookie # def cook1(request): # print(request.COOKIES) # 查看cooke # # print(request.get_sig ...
- Django实现表单验证、CSRF、cookie和session、缓存、数据库多表操作(双下划綫)
通常验证用户输入是否合法的话,是前端js和后端共同验证的,这是因为前端js是可以被禁用的,假如被禁用了,那就没法用js实现验证合法与否了,也就是即使用户输入的不合法,但是也没提示,用户也不知道怎么输入 ...
- Django之Form、CSRF、cookie和session
Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和 ...
- python_way day19 HTML-day5 (form表单验证,CSRF,cookie,session,缓存)
python-way day19 1. dJango的form表单验证 2.CSRF 跨站请求伪造 3.cookie,session 4.缓存 一,django表单验证功能 1.django验证基础: ...
- python运维开发(十九)----Django后台表单验证、session、cookie、model操作
内容目录: Django后台表单验证 CSRF加密传输 session.cookie model数据库操作 Django后台Form表单验证 Django中Form一般有2种功能: 1.用于做用户提交 ...
随机推荐
- Create database 创建数据库
首先在ORACLE用户下进入.bash_profile文件 [oracle@linux02 ~]$ vi .bash_profile export ORACLE_SID=hldbexport ORAC ...
- JQuery 分页显示jquery-pager-1.0.js
原版是jquery-pager-1.0.js,经过变更修改加上按照项目中的一些需要修改过来. //初始化分页控件 PagerOptions为配置参数 url为要提交的url地址,如果不需要提交则可以为 ...
- 【已解决】IIS搭建 asp.net core 项目后 其他电脑访问不到资源文件
IIS搭建asp.net core 项目后,访问不到里面的资源文件(图片等),解决方法如下: 1.检查asp.net core发布文件中的资源文件是不是都放到了wwwroot名称的目录中. 2.检查a ...
- Codeforces Round #417 (Div. 2)-A. Sagheer and Crossroad
[题意概述] 在一个十字路口 ,给定红绿灯的情况, 按逆时针方向一次给出各个路口的左转,直行,右转,以及行人车道,判断汽车是否有可能撞到行人 [题目分析] 需要在逻辑上清晰,只需要把所有情况列出来即可 ...
- Python3 数据结构
列表 Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能. 以下是 Python 中列表的方法: 方法 描述 list.append(x ...
- 【SSH系列】Hibernate映射 -- 一对一单向关联映射
映射原理 一对一关联映射:两个实体对象之间是一对一的关联映射,即一个对象只能与另外唯一的一个对象相对应.有两种策略可以实现一对一的关联映射: a.主键关联:即让两个对象具有相 ...
- Java web文件上传下载
[版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/52048666 作者:朱培 ID:sdksdk0 邮 ...
- Unable to ignore resources
摘要:分享牛,分享牛系列, Unable to ignore resources Attempted to beginRule: 异常信息处理. 出现Unable to ignore resource ...
- 如何在控制台切换Xcode的版本
打开控制台,输入 xcode-select -p 你可以看到当前Xcode所使用的版本路径,比如本猫的输出为: /Applications/Xcode-beta.app/Contents/Develo ...
- Java程序员必备知识-多线程框架Executor详解
为什么引入Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞 ...