Go语言Web框架gwk介绍 (五)
Session
Go的net/http本身不带session的机制,需要开发人员自行实现,gwk实现了内存中的session存储机制,如果需要将session存在其他地方比如redis或者memcache需要实现gwk的session.Driver接口。
session.Driver
session.Driver的接口如下
type Driver interface {
// 初始化
Init(options string) error
// Driver的名字
Name() string
// 添加key,如果重复返回false,error
Add(sessionId, key string, value interface{}) (bool, error)
// 读取key的值,如果不存在返回nil,false,nil,如果报错返回nil,false,error
Get(sessionId, key string) (interface{}, bool, error)
// 添加key,如果存在则更新
Set(sessionId, key string, value interface{}) error
// 移除key
Remove(sessionId, key string) error
// 根据sessionid创建新的session
New(sessionId string, timeout time.Duration) error
// 移除整个session
Abandon(sessionId string) error
// 判断sessionid是否存在
Exists(sessionId string) (bool, error)
// 返回session中所有key
Keys(sessionId string) ([]string, error)
}
gwk的Driver接口相比其他的框架要复杂一点,主要是为了Driver的开发人员可以实现更精确的控制。
自定义的session.Driver可以通过函数Register注册。
func Register(name string, driver Driver)
gwk内置了In-memory的session.Driver的实现, 注册的名字为"session_default",是基于开源项目MCache的,MCache的详细信息请参考其项目主页 [https://github.com/sdming/mcache]。
你可以通过修改web.conf文件或者直接修改WebConfig实例来启用或者关闭session机制,配置项如下:
- SessionEnable: 是否启用session
- SessionTimeout: session的超时时间
- SessionDriver: session driver的名字
如果你的session.Driver需要保存配置信息,请放在plugin.conf文件,gwk初始化时会将Config.PluginConfig.Child(session_driver_name)的数据作为options参数调用Driver的Init方法。
使用Session
你可以通过HttpContext的字段Session来获得session实例,字段SessionIsNew来获取session是否当前的请求创建的,方法SessionId()获取session的id。
./demo中的session.go文件演示了如何操作session。
获取session id
// url: /session/id
func (c *Session) Id(ctx *wk.HttpContext) (wk.HttpResult, error) {
id := ctx.SessionId()
return wk.Data(id), nil
}
添加session
// url: /session/add?k=test&v=101
func (c *Session) Add(ctx *wk.HttpContext) (wk.HttpResult, error) {
ok, err := ctx.Session.Add(ctx.FV("k"), ctx.FV("v"))
return wk.Data(ok), err
}
读取session中key的值
// url: /session/get?k=test
func (c *Session) Get(ctx *wk.HttpContext) (result wk.HttpResult, err error) {
v, _, err := ctx.Session.Get(ctx.FV("k"))
return wk.Data(v), err
}
设置session
// url: /session/set?k=test&v=101
func (c *Session) Set(ctx *wk.HttpContext) (wk.HttpResult, error) {
err := ctx.Session.Set(ctx.FV("k"), ctx.FV("v"))
return wk.Data(err == nil), err
}
移除session中的key
// url: /session/remove?k=test
func (c *Session) Remove(ctx *wk.HttpContext) (wk.HttpResult, error) {
err := ctx.Session.Remove(ctx.FV("k"))
return wk.Data(err == nil), err
}
放弃整个session
// url: /session/abandon
func (c *Session) Abandon(ctx *wk.HttpContext) (wk.HttpResult, error) {
err := ctx.Session.Abandon()
return wk.Data(true), err
}
返回session中所有的key
// url: /session/keys
func (c *Session) Keys(ctx *wk.HttpContext) (wk.HttpResult, error) {
keys, err := ctx.Session.Keys()
return wk.Data(fmt.Sprintln(keys)), err
}
另外在session.go中还包含一个如何注册自定义session.Driver的例子。
缓存
view模板的缓存以及配置数据的缓存前文已经讲过,除此之外gwk可以将静态文件的内容缓存到内存中。这种缓存策略并不一定很有用,如果网站规模小流量不大,缓存静态文件的收益有限,而网站达到一定规模,为了提升性能,静态文件常部署在单独的静态文件服务器或者借助CDN,另外Go的内核用sendfile来处理静态文件,如果将其内容缓存到内存就没有办法用到sendfile的优势了。
开启gwk静态文件缓存的配制方法如下:
#plugin.conf
#static processor config
static_processor: {
#开启静态文件缓存,默认是false
cache_enable: true
#缓存1小时(3600秒),默认是86400秒
cache_expire: 3600
}
# -->end static processor
gzip压缩可以参考前文的CompressProcessor部分
gwk并不内置供开发人员调用的Cache功能,如果需要in-memory的第三方缓存库,可以参考上文提到的MCache,项目在 [https://github.com/sdming/mcache]
日志
gwk本身不实现复杂的日志功能,只是公开了一个log.Logger类型的字段Logger,所有的日志信息会被记录到这个Logger中,另外你还可以通过设置LogLevel来调整记录日志的级别,默认为LogError,支持的日志级别为:
const (
LogError = iota
LogDebug
)
验证
虽然很多Web框架提供了验证功能,但gwk还没有这方面的计划。
ORM
gwk关注Web开发,短时间内不会包含ORM的功能,需要访问数据库的开发人员可以关注开源项目(kdb)[https://github.com/sdming/kdb],项目刚启动,功能大概完成了30%。
Performance benchmark
Incoming
Go语言Web框架gwk介绍 (五)的更多相关文章
- Go语言Web框架gwk介绍4
Go语言Web框架gwk介绍 (四) 事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(m ...
- Go语言Web框架gwk介绍 3
Go语言Web框架gwk介绍 (三) 上一篇忘了ChanResult ChanResult 可以用来模拟BigPipe,定义如下 type ChanResult struct { Wait syn ...
- Go语言Web框架gwk介绍2
Go语言Web框架gwk介绍 (二) HttpResult 凡是实现了HttpResult接口的对象,都可以作为gwk返回Web客户端的内容.HttpResult接口定义非常简单,只有一个方法: ty ...
- Go语言Web框架gwk介绍 1
Go语言Web框架gwk介绍 (一) 今天看到Golang排名到前30名了,看来关注的人越来越多了,接下来几天详细介绍Golang一个web开发框架GWK. 现在博客园支持markdown格式发布 ...
- Go语言Web框架gwk介绍 (一)
今天看到Golang排名到前30名了,看来关注的人越来越多了,接下来几天详细介绍Golang一个web开发框架GWK. 现在博客园支持markdown格式发布文章么?后台的编辑器不太好用嘛. GWK ...
- Go语言Web框架gwk介绍 (四)
事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(moudle, name string, h ...
- Go语言Web框架gwk介绍 (二)
HttpResult 凡是实现了HttpResult接口的对象,都可以作为gwk返回Web客户端的内容.HttpResult接口定义非常简单,只有一个方法: type HttpResult inter ...
- Go语言Web框架gwk介绍 (三)
上一篇忘了ChanResult ChanResult 可以用来模拟BigPipe,定义如下 type ChanResult struct { Wait sync.WaitGroup Chan chan ...
- 最好的6个Go语言Web框架
原文:Top 6 web frameworks for Go as of 2017 作者:Edward Marinescu 译者:roy 译者注:本文介绍截至目前(2017年)最好的6个Go语言Web ...
随机推荐
- ADB安装
1,下载解压 http://adbshell.com/downloads 2,配置路径 比如解压后我放在了C:\Program Files\adb 电脑-->属性-->高级系统设置--&g ...
- JAVA复习笔记分布式篇:kafka
前言:第一次使用消息队列是在实在前年的时候,那时候还不了解kafka,用的是阿里的rocket_mq,当时觉得挺好用的,后来听原阿里的同事说rocket_mq是他们看来kafka的源码后自己开发了一套 ...
- U盘删除文件时提示“文件或目录损坏且无法读取”的解决方法
U盘删除文件时提示“文件或目录损坏且无法读取”的解决方法 出现原因:在写入或读取文件时,进行复制操作,此时复制到的文件是不完整的!或者移动硬盘/U盘中途被拔出,导致文件损坏 异常现象:被删文件(夹)属 ...
- CVE-2012-4792Microsoft Internet Explorer 释放后使用漏洞
Microsoft Internet Explorer是微软Windows操作系统中默认捆绑的WEB浏览器. Microsoft Internet Explorer 6至8版本中存在释放后使用漏洞.通 ...
- 20165333实验三 敏捷开发与XP实践
实验内容 一.参考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安装alibaba 插件,解决代码中的规范问题. 在IDE ...
- NopCommerce 执行计划任务不同Services协调操作导致更新数据失败的问题!
问题描述: 在Nop的计划任务里需要两个任务协调操作 _shipmentService.InsertShipment(shipment); _orderProcessingService.Ship(s ...
- Jquery Datatable添加复选框,实现批量操作。
最近一段时间,一直在写前端的东西,自己也不擅长,最近也有所长进,把工作中用到的一些前端知识整理一下,下次用到就不用再找了.这次主要是在datatable中添加复选框,然后实现批量操作的功能.因为是公司 ...
- JSON解析代码
/** * 解析有数据头的纯数组 */ private void parseHaveHeaderJArray() { //拿到本地JSON 并转成String String strByJson = J ...
- Web Api之Cors跨域以及其他跨域方式(三)
我们知道ajax不能跨域访问,但是有时我们确实需要跨域访问获取数据,所以JSONP就此诞生了,其本质使用的是Script标签,除JSONP以外还有另外实现跨域方式 一.手动实现JSONP跨域 1.首先 ...
- think组合查询AND和OR一起用
如下示例: $_where 和 $where组合查询 $_where之间用OR $where之间用AND 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...