Python中web.py session使用,解决EOFError

使用web.py 搭建web服务器端非常非常简单方便,而且从数据库中查询数据转换成JSON格式非常非常的方便,所以最近在项目中使用web.py搭建了一个后台
但是在正式服务器上使用的时候经常出现Python 内存读取错误
Python.exe应用程序错误 “0x64024e96” 指令引用的 “0x00000135” 内存。该内存不能为 “read”
百思不得其解,随后又发现session.py中出现错误 pickle.loads() EOFError
如下图

下面开始了我的摸索之路

一.更改session配置

更改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

二、自定义Seesion

在自己项目下新建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就可以解决

三、使用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

目前运行正常~~~~~~~~~

你可能感兴趣的:(session,python,web.py,eoferror)