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保存在客户端中。

  客户端用cookie保存了sessionID,当我们请求服务器的时候,会把这个sessionID一起发给服务器,服务器会到内存中搜索对应的sessionID,如果找到了对应的 sessionID,说明我们处于登录状态,有相应的权限;如果没有找到对应的sessionID,这说明:要么是我们把浏览器关掉了(后面会说明为什 么),要么session超时了(没有请求服务器超过20分钟),session被服务器清除了,则服务器会给你分配一个新的sessionID。你得重新登录并把这个新的sessionID保存在cookie中。 

session的结构

  上面提到了session在webpy中式一种dict的方式存储,

  Session类

 

  在webpy的session中,存储方式包括两种DiskStore和DBStore,分别为硬盘存储和数据库存储。

  

  

  而session的存储也可以看出来,把sessionid作为key来存储session信息

  


本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/p/4077661.html,如需转载请自行联系原作者

相关文章
|
4月前
|
中间件 开发工具 数据安全/隐私保护
Django实践-05Cookie和Session
Django实践-05Cookie和Session
Django实践-05Cookie和Session
|
4月前
|
存储 小程序 NoSQL
laravel5.8(九)session基本使用
Session这个玩意还是挺重要的。 Laravel对于session的支持还是很完全的。 一:文件位置 Session 配置文件位于 config/session.php。 默认情况下,Laravel 使用的 Session 驱动为 file 驱动,这对许多应用而言是没有什么问题的。 在生产环境中,你可能考虑使用 memcached 或者 redis 驱动以便获取更佳的 Session 性能,尤其是线上同一个应用部署到多台机器的时候,这是最佳实践。 1. 复制代码 Session 驱动用于定义请求的 Session 数据存放在哪里,Laravel 可以处理多种类型的驱动: 1. bash
39 0
|
10月前
|
数据采集 Python
python爬虫系列之Session相关知识
python爬虫系列之Session相关知识
|
存储 安全 数据安全/隐私保护
Flask学习与项目实战8:cookie与session的介绍与使用
cookie:在最开始的网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户。c
Flask学习与项目实战8:cookie与session的介绍与使用
|
数据采集 Web App开发 存储
Python爬虫学习:Cookie 和 Session 的区别是什么?
Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。
157 0
|
存储 Web App开发 数据库
【Ruby on Rails全栈课程】3.6 登录功能--session、cookie
1、功能描述 (1)登录需要填写信息:邮箱、密码。当邮箱没有注册需要进行相应的提示。 (2)将数据库保存的密码解密后,与用户在页面输入的密码作对比,相同可登录。 (3)用户角色为管理员时,需要判断这个账号的状态,状态为未激活时(status为1),需要flash.notice提醒激活。 2、编辑controller、view、路由 (1)在路由文件config/routes.rb中添加路由,通过此链接来提交在登录页面提交的信息
167 0
【Ruby on Rails全栈课程】3.6 登录功能--session、cookie
|
存储 缓存 安全
小白学Django第九天| Cookie和session的那些骚操作
小白学Django第九天| Cookie和session的那些骚操作
170 0
小白学Django第九天| Cookie和session的那些骚操作
|
Python
小白学Flask第七天| 讲讲cookie和session的操作
小白学Flask第七天| 讲讲cookie和session的操作
170 0
小白学Flask第七天| 讲讲cookie和session的操作
|
Python 存储
Pythonweb框架中的setcookie究竟做了什么?session与cookie关系
Pythonweb框架中的setcookie究竟做了什么?session与cookie关系
|
前端开发 数据库 Python
django搭建Bootstrap常用问题解决方法
1、进入页面,提示Creating a ModelForm without either the 'fields' attribute or the 'exclude'时 解决方法:打开forms.py文件,修改如下: class TestModelForm(forms.
961 0