使用web.py 搭建web服务器端非常非常简单方便,而且从数据库中查询数据转换成JSON格式非常非常的方便,所以最近在项目中使用web.py搭建了一个后台
但是在正式服务器上使用的时候经常出现Python 内存读取错误
Python.exe应用程序错误 “0x64024e96” 指令引用的 “0x00000135” 内存。该内存不能为 “read”
百思不得其解,随后又发现session.py中出现错误 pickle.loads() EOFError
如下图
下面开始了我的摸索之路
更改session配置
web.config.debug = False
app = web.application(urls, globals())
""" cookie_name - 保存session id的Cookie的名称 cookie_domain - 保存session id的Cookie的domain信息 timeout - session的有效时间 ,以秒为单位 ignore_expiry - 如果为True,session就永不过期 则即使过期时间到,也不会提示客户端session过期,但是会在服务器端把之前的session删除,重新生成一个session; 即此时等同于新来的请求,后面该登录的还要重新登录;否则如果该值为False,那么在session过期时间后【即timeout所设置的时间】,将会返回字符串expired_message ignore_change_ip - 如果为False,就表明只有在访问该session的IP与创建该session的IP完全一致时,session才被允许访问。 secret_key - 密码种子,为session加密提供一个字符串种子 expired_message - session过期时显示的提示信息。 """
web.config.session_parameters['cookie_name'] = 'webpy_session_id'
web.config.session_parameters['cookie_domain'] = None
#自定义cookie_path 会话过期处理
#web.config.session_parameters['cookie_path'] = '/'
web.config.session_parameters['timeout'] = 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'] = '会话已过期,请重新登录'
if web.config.get('_session') is None:
session = web.session.Session(app,
web.session.DiskStore('sessions'), {'count': 0})
session = web.session.Session(app,
else:
session = web.config._session
在自己项目下新建session.py
import web
from web.session import Session
class MySessionExpired(web.HTTPError):
def __init__(self, headers,message):
web.HTTPError.__init__(self, '200 OK', headers, data=message)
class MySession(Session):
def __init__(self, app, store, initializer=None):
Session.__init__(self,app,store,initializer)
def expired(self):
self._killed = True
self._save()
message = self._config.expired_message
headers = {'Content-Type': 'text/html','Refresh':'2;url="/login"'}
raise MySessionExpired(headers, message)
在其他模块中引用
from session import MySession
web.config.session_parameters['cookie_name'] = 'webpy_session_id'
web.config.session_parameters['cookie_domain'] = None
#自定义cookie_path 会话过期处理
web.config.session_parameters['cookie_path'] = '/'
web.config.session_parameters['timeout'] = 1*60 # 1分钟过期
web.config.session_parameters['ignore_expiry'] = False
web.config.session_parameters['ignore_change_ip'] = True
web.config.session_parameters['secret_key'] = 'fLjUfxqXtfNoIldA0A0J'
web.config.session_parameters['expired_message'] = '会话已过期,请重新登录'
if web.config.get('_session') is None:
session = MySession(app, web.session.DiskStore('sessions'), {'count': 0})
web.config._session = session
else:
session = web.config._session
问题依旧没有解决,再经过一番搜索发现是因为我开始使用的是DiskStore,文件存储session,所以当多用户同时读取session文件时就会报这个错误
使用DBStore数据库存储session就可以解决
先建立一个sqlite数据库 sessions.db,然后建一个sessions表
包含三个字段“session_id”,“atime”,“data”
SQL 脚本
CREATE TABLE "sessions" ("session_id" VARCHAR PRIMARY KEY NOT NULL UNIQUE, "atime" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, "data" TEXT)
然后在module中使用
#使用数据库存储 使用dbstore 防止eoferror
db = web.database(dbn='sqlite', db='sessions.db')
if web.config.get('_session') is None:
session = web.session.Session(app, web.session.DBStore(db,'sessions'), {'count': 0})
web.config._session = session
else:
session = web.config._session
如果要使用其他数据库请参考
python 连接mssqlserver方法之pymssql
目前运行正常~~~~~~~~~