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介绍 (五)的更多相关文章

  1. Go语言Web框架gwk介绍4

    Go语言Web框架gwk介绍 (四)   事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(m ...

  2. Go语言Web框架gwk介绍 3

    Go语言Web框架gwk介绍 (三)   上一篇忘了ChanResult ChanResult 可以用来模拟BigPipe,定义如下 type ChanResult struct { Wait syn ...

  3. Go语言Web框架gwk介绍2

    Go语言Web框架gwk介绍 (二) HttpResult 凡是实现了HttpResult接口的对象,都可以作为gwk返回Web客户端的内容.HttpResult接口定义非常简单,只有一个方法: ty ...

  4. Go语言Web框架gwk介绍 1

    Go语言Web框架gwk介绍 (一)   今天看到Golang排名到前30名了,看来关注的人越来越多了,接下来几天详细介绍Golang一个web开发框架GWK. 现在博客园支持markdown格式发布 ...

  5. Go语言Web框架gwk介绍 (一)

    今天看到Golang排名到前30名了,看来关注的人越来越多了,接下来几天详细介绍Golang一个web开发框架GWK. 现在博客园支持markdown格式发布文章么?后台的编辑器不太好用嘛. GWK ...

  6. Go语言Web框架gwk介绍 (四)

    事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(moudle, name string, h ...

  7. Go语言Web框架gwk介绍 (二)

    HttpResult 凡是实现了HttpResult接口的对象,都可以作为gwk返回Web客户端的内容.HttpResult接口定义非常简单,只有一个方法: type HttpResult inter ...

  8. Go语言Web框架gwk介绍 (三)

    上一篇忘了ChanResult ChanResult 可以用来模拟BigPipe,定义如下 type ChanResult struct { Wait sync.WaitGroup Chan chan ...

  9. 最好的6个Go语言Web框架

    原文:Top 6 web frameworks for Go as of 2017 作者:Edward Marinescu 译者:roy 译者注:本文介绍截至目前(2017年)最好的6个Go语言Web ...

随机推荐

  1. 十三、springboot集成定时任务(Scheduling Tasks)

    定时任务(Scheduling Tasks) 在springboot创建定时任务比较简单,只需2步: 1.在程序的入口加上@EnableScheduling注解. 2.在定时方法上加@Schedule ...

  2. python网络编程--RabbitMQ

    一:RabbitMQ介绍 RabbitMQ是AMPQ(高级消息协议队列)的标准实现.也就是说是一种消息队列. 二:RabbitMQ和线程进程queue区别 线程queue:不能跨进程,只能用于多个线程 ...

  3. Ibatis.Net 各类的作用说明学习(三)

    Ibatis中,加载.分析配置及映射文件是在创建SqlMapper实例的时候进行的,另外对数据库的操作,也是在SqlMapper实例上调用方法来完成.创建SqlMapper的实例的方式是: ISqlM ...

  4. centos7上安装指定版本gitlab

    当我们在做gitlab服务器迁移的时候需要两台服务器中的gitlab相同,如果不同则不让回复git备份.这样我们就要安装指定版本的gitlab. 1. 安装依赖软件 yum -y install po ...

  5. IE手工导入证书

    打开cer文件->欢迎使用证书导入向导->下一步->将所有的证书放入下列存储->受信任的根证书颁发机构->完成

  6. JSP和Servlet那些事儿系列--HTTPS

    原文:http://qingkangxu.iteye.com/blog/1614053 <JSP和Servlet那些事儿 >系列文章旨在阐述Servlet(Struts和Spring的MV ...

  7. Centos中查询目录中内容命名ls

    首先解释下这块, root代表当前登录用户,localhost代表主机名, ~代表当前主机目录,  #代表用户权限   #表示超级用户,$表示普通用户: 查询目录中内容命令 ls  (list缩写) ...

  8. jquery中获取iframe的id的方法:

    jquery中获取iframe的id的方法: var frameId = window.frameElement && window.frameElement.id || ''; al ...

  9. WinForm界面开发之 启动界面

    我们在开发桌面应用程序的时候,由于程序启动比较慢,往往为了提高用户的体验,增加一个闪屏,也就是SplashScreen,好处有:1.让用户看到加载的过程,提高程序的交互响应:2.可以简短展示或者介绍程 ...

  10. sicily 1046. Plane Spotting(排序求topN)

    DescriptionCraig is fond of planes. Making photographs of planes forms a major part of his daily lif ...