首页 > 其他分享 >webpy中使用session

webpy中使用session

时间:2022-12-20 11:37:07浏览次数:63  
标签:web session cookie 使用 config id webpy 客户端


在使用session之前要理解什么是session以及其在编程中的实际形态是怎么样的,那么这里有一个网页说的还算清楚,贴过来直接【虽然这个网页一看就知道不是原创了,但是原创的我已经是找不到了】​​http://www.2cto.com/kf/201206/135471.html​

上面网页里已经说的很清楚了,session是在服务器端生存并控制的,在客户端只能是暂时保存一个session的凭证--就是session id;客户端保存session id的方式有多种:url后缀、网页的隐藏字段、cookie中;其中最常用的是cookie,只有在客户端禁用cookie的情况下才会考虑其它情况;单就是cookie保存session id还会分成硬盘保存、内存保存两种形式;其中硬盘保存方式在关闭浏览器后再次开启时仍会生效【具体还要取决于cookie的有效期】,而内存的保存方式下只要浏览器一旦被关闭就会丢失session id;而内存方式保存session在不同浏览器中的共享机制也是不一样的,FF是所有同域名的tab页都共享一个session id,而ie下同域不同的tab页是不共享session id的,只有继承tab页会与母tab页共享session id【使用Ctrl+N打开的新页面就是继承页】,所以即使是内存session也会有串session的情况。【测试的同学可以多尝试一下,呵呵】

到这里基本没有客户端什么事了,所有关于session的主要工作都在服务器端进行,首先在服务器会检测每一个用户的请求,获取用户请求的相关信息【如:ip,cookie】,服务器会首先检查有没有特定的session id字段【当然是自己上次设置的字段】,如果没有说明这个客户端是第一次或者中断过请求,因此会新生成一个session对象并产生一个session id,在这次的用户访问过程中,服务器可以记录下有用的用户信息并保存在该session id标签下;服务器处理结束后在响应时的头里面把session id作为cookie设置进去,下次再来请求的时候就会有session id可以查询了,就认为这个客户端不是第一次请求了,服务器端也可以通过session id来查询之前用户操作所保留的用户信息,这个就保障了用户多次连续访问时的状态和信息的连续性,而http本身是无状态的,不使用session机制则不能达到这种效果。

而关于session对象的创建,session id响应头都的设置等工作都是标准化的,所以webpy中也提供了支持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() ##结束一个session
return ""

if __name__ == "__main__":
app.run()

在客户端session id可以保存在内存和硬盘上,而在服务器端session的内存也可以保存在内存、硬盘,甚至是数据库中,反正能保存的信息的载体都可以,而webpy中只支持硬盘和数据库2种形式,如果需要使用到其它形式的存储方式,则可以自己新写一个web.utils子类,并实现其对应方法即可,然后替换掉上面代码中的


web.session.DiskStore('sessions')

当然在服务器端的session保存也是可以设置为有效期了,因为如果没有失效期限,那么即使再大的内存,硬盘总会有一天被session填满,所以使用session时记得设置过期时间;在服务器端让session失效,除了设置有效期,还有就是通过客户端的请求来主动关闭session

session.kill()

另一个需要注意的是上面代码是在一个文件中,而session是当前文件中的全局变量,所以session是可以共用的;而日常编程不可能所有内容在一个文件中,而session又不是web级别的全局变量,所以要想在多个文件的工程中使用同一个session的话,就需要在服务器初始化时把session设置为全局都可以访问的位置,如:web.config,

web.config._session = session

这样在其的页面只有你引用了web模块,就可以通过web.config._session来访问session内容了。但是session默认在debug模式不能使用,所以官方的用例会把调试模式关闭,web.debug=false,因为debug模式会reload模块,这样session也会被反复reload,其实可以通过以下代码来避免关闭调试模式:


if web.config.get("_session") is None:
from web import utils
store = web.session.DiskStore('sessions')
user = utils.Storage({
"id": "",
"name": "",
"email": "",
"privilege": "",
})
session = web.session.Session(app, store,
initializer={
"status": 0,
"user": user,
})
web.config._session = session
else:
session = web.config._session

还有一种方法让session在全局可用,主程序页添加如下代码:


def session_hook():
web.ctx.session = session

app.add_processor(web.loadhook(session_hook))

在其它页面调用session:

print web.ctx.session.test
web.ctx.session.foo = 'bar'

此外webpy中还提供了设置session的入口,可以通过这些设置入口来设置session的一些属性,如:有效期等:


web.config.session_parameters['cookie_name'] = 'webpy_session_id'
web.config.session_parameters['cookie_domain'] = None
web.config.session_parameters['timeout'] = 86400, #24 * 60 * 60, # 24 hours in seconds
web.config.session_parameters['ignore_expiry'] = True
web.config.session_parameters['ignore_change_ip'] = True
web.config.session_parameters['secret_key'] = 'fLjUfxqXtfNoIldA0A0J'
web.config.session_parameters['expired_message'] = 'Session expired'


参考资料:​ http://www.2cto.com/kf/201206/135471.html ​​ http://webpy.org/cookbook/userauthpgsql


http://webpy.org/cookbook/sessions.zh-cn

标签:web,session,cookie,使用,config,id,webpy,客户端
From: https://blog.51cto.com/u_15918230/5954631

相关文章

  • go使用sync.Pool的性能对比
    在业务代码编码中,涉及到经常用前创建,用后销毁的资源,为了提高性能,减少内存分配,减轻GC压力,自然而然地就会联想到使用对象池的应用。go在很多方面都有着sync.Pool的应用,我们......
  • kafka使用教程
    kafka概述kafka架构基础名称producer向kafkabroker发消息的客户端consumer向kafkabroker取消息的客户端consumergroup组内每个消费者消费不同......
  • gem使用代理安装ruby-debug-base19
    gem使用代理的两种方式:方式一:>>SEThttp_proxy=http://ip_or_host:PORT>>geminstallthe_package_name方式二:>>gemlist-phttp://user:passwd@ip_or_host:8080-r安装ru......
  • webpy中配置发送邮件服务
    官方cookbook链接:http://webpy.org/cookbook/sendmail.zh-cn前提:需要安装web.py了,因为我这个web应用是用web.py写的#!\urs\bin\envpython#encoding:utf-8importwebdefse......
  • MySQL使用--存储过程篇
    查看存储过程:select`name`frommysql.procwheredb='your_db_name'and`type`='PROCEDURE'SHOWprocedurestatus;查看存储过程的创建代......
  • MySQL使用--通用操作篇
    服务启动:netstartmysql(windows启动)"/etc/rc.d/init.d/mysqldstart"(linux启动)用户登录:mysql[mydb]-h127.0.0.1-uroot-ppassword;常用统计......
  • MySQL使用--表操作篇
    查看表描述:DESCRIBEMYTABLE;创建表:CREATETABLE[IFNOTEXISTS]表名称(列名称1数据类型[属性][索引],列名称2数据类型[属性][索引],列名称......
  • python中telnetlib模块的使用
    python下能支持telnet的模块telnetlib是内置模块,直接import就可以了,其基本的使用方法也是比较简单的。 #encoding=utf-8defdo_telnet(Host,username,password,finish,......
  • py2exe简单使用
    前提条件:需要安装easy-install模块,这是一个python的模块打包工具。py2exe模块安装:​​​http://prdownloads.sourceforge.net/py2exe下载对应版本的安装包。​​​样例......
  • MySQL使用--内建函数篇
    一.字符串类:CHARSET(str)//返回字串字符集CONCAT(string2[,...])//连接字串INSTR(string,substring)//返回substring首次在string中出现的......