webpy使用笔记(二) session的使用

发布时间:2017-09-13 11:50:17
webpy使用笔记(二) session的使用   webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶着重复的基本工作,从在学校时候就养成了追究原理的习惯,从而有了这篇session的使用和说明。

  PS:其实有些总结的东西挺好的,想分享给大家看,而不是枯燥的代码,这东西说实话对其他人用处不大,但都被移除首页了~~

webpy中的session

  下面为官方的例子,用session来存储页面访问的次数,从而实现对访问次数的记录。

  (PS,这里记录是针对一个客户端来说的访问次数,而不是官方文档说的统计有多少人正在使用session,因为每个客户端的session并不相同,服务器会根据不同的sessionid来区分不同的客户端的session)

  需要注意的是,官方说明在调试情况下,session并不能正常的运行,所以需要在非调试摸下测试,那么就有了下面的这个例子。

import web

#非调试模式

web.config.debug = False

urls = (

"/count", "count",

"/reset", "reset"

)

app = web.application(urls, locals())

session = web.session.Session(app, web.session.DiskStore('sessions'), initializer={'count': 0})

class count:

def GET(self):

session.count += 1

return str(session.count)

class reset:

def GET(self):

session.kill()

return ""

if __name__ == "__main__":

app.run()

  在官方文档中,对上述debug模式的现象给出了这样的解释:

  session与调试模试下的重调用相冲突(有点类似firefox下著名的Firebug插件,使用Firebug插件分析网页时,会在火狐浏览器之外单独对该网页发起请求,所以相当于同时访问该网页两次)

  为了解决上述问题,官方给出了进一步的解决方法,如下

import web

urls = ("/", "hello")

app = web.application(urls, globals())

if web.config.get('_session') is None:

session = web.session.Session(app, web.session.DiskStore('sessions'), {'count': 0})

web.config._session = session

else:

session = web.config._session

class hello:

def GET(self):

print 'session', session

session.count += 1

return 'Hello, %s!' % session.count

if __name__ == "__main__":

app.run()

  由于web.session.Session会重载两次,但是在上面的_session并不会重载两次,因为上面多了一个判断_session是否存在于web.config中。

  其实,站群软件,在web.py文件中,定义了config,而Storage在下面的图中并没有特殊的结果,像字典一样~

#web.py

config = storage()

#utils.py

storage = Storage

在webpy的子程序中使用session

  虽然官方文档中提到,只能在主程序中使用session,但是通过添加__init__.py可以条用到该页面的session,也就是说一样使用session。

  官方给出的方法更加合理化一点,通过应用处理器,加载钩子(loadhooks)

  在webpy中,应用处理器为app.add_processor(my_processor),下面的代码添加到上述的完整例子中,可以再处理请求前和处理请求后分别条用my_loadhook()和my_unloadhook()。

def my_loadhook():

print "my load hook"

def my_unloadhook():

print "my unload hook"

app.add_processor(web.loadhook(my_loadhook))

app.add_processor(web.unloadhook(my_unloadhook))

结果如下,我在处理中打印了session:

  从而,可以再web.loadhook()中加载session信息,在处理之前从web.ctx.session中获取session了,甚至可以在应用处理器中添加认证等操作。

#main.py

def session_hook():

  web.ctx.session = session

app.add_processor(web.loadhook(session_hook))

#views.py

class edit:

def GET(self):

try:

session = web.ctx.session

username = session.username

if not username:

return web.redirect('/login')

except Exception as e:

return web.redirect('/login')

return render_template('edit.html')

sessionid

  对于服务器来说,怎样才能区分不同客户端呢,怎样才能区分不同客户端的session呢?

  是通过sessionid来实现的,最初我还傻傻的分不清session和cookie,以及不同用户之间的信息室如何分配的!

  

  如上图,是生成sessionid的代码段,其中包含了随机数、时间、ip以及秘钥。

  在客户端访问服务器时,服务器会根据上述信息来计算一个针对客户端唯一的sessionid,并通过cookie保存在客户端中。

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站制作公司哪家好 https://www.feimao666.com