Fixes in sessions for avoid problems, now use diskcache for file sessions

This commit is contained in:
Antonio de la Rosa 2017-06-07 05:22:19 +02:00
parent 41462b3bda
commit c23b650277
3 changed files with 40 additions and 70 deletions

View file

@ -6,6 +6,11 @@ from bottle import request, response
import os
import json
import fcntl
import errno
import time
import shutil
import uuid
from diskcache import Cache
try:
@ -72,12 +77,6 @@ class ParamecioSession:
def save(self):
# Here get the function for load session
"""
path_cookie=config.session_opts['session.data_dir']+'/session_'+self.session['token']
with open(path_cookie, 'w') as f:
f.write(json.dumps(self.session))
"""
save_session(self.session['token'], self.session)
@ -118,23 +117,6 @@ def get_session():
# Here get the function for load session
"""
path_cookie=config.session_opts['session.data_dir']+'/session_'+cookie
if os.path.isfile(path_cookie):
with open(path_cookie) as f:
json_txt=f.read()
if(json_txt).strip()!='':
s=json.loads(json_txt)
else:
s={'token': cookie}
else:
s={'token': cookie}
"""
s=load_session(cookie)
request.environ['session']=s
@ -146,7 +128,11 @@ def get_session():
return ParamecioSession(s)
if config.session_opts['session.type']=='redis':
if config.session_opts['session.type']=='mysql':
pass
elif config.session_opts['session.type']=='redis':
import redis
@ -173,54 +159,32 @@ if config.session_opts['session.type']=='redis':
r.set(token, json.dumps(session))
def after_session():
pass
else:
cache=Cache(config.session_opts['session.data_dir'])
def load_session(token):
# Here get the function for load session
path_cookie=config.session_opts['session.data_dir']+'/session_'+token
if os.path.isfile(path_cookie):
with open(path_cookie) as f:
json_txt=f.read()
if(json_txt).strip()!='':
s=json.loads(json_txt)
if token in cache:
s=json.loads(cache[token])
else:
s={'token': token}
else:
# Need regenerate session
s=generate_session()
cache.add(token, json.dumps(s))
return s
def save_session(token, session):
path_cookie=config.session_opts['session.data_dir']+'/session_'+token
with open(path_cookie, 'w') as f:
cache[token]=json.dumps(session)
#pass
pass
#Lock file, if cannot lock wait
while True:
try:
fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
break
except IOError as e:
# raise on unrelated IOErrors
if e.errno != errno.EAGAIN:
raise
else:
time.sleep(0.1)
f.write(json.dumps(session))
fcntl.flock(f, fcntl.LOCK_UN)
"""
def generate_session():
s=request.environ.get(config.cookie_name)
@ -235,11 +199,11 @@ def get_session():
return request.environ.get(config.cookie_name)
#ParamecioSession()
else:
return None
return ParamecioSession({})
except:
return None
return ParamecioSession({})
"""
"""
try:

View file

@ -9,6 +9,7 @@ from paramecio.citoplasma.datetime import set_timezone
from itsdangerous import JSONWebSignatureSerializer
from paramecio.citoplasma.keyutils import create_key_encrypt, create_key_encrypt_256, create_key
from paramecio.wsgiapp import app
#from paramecio.citoplasma.sessions import after_session
modules_pass=False
@ -23,6 +24,19 @@ modules_pass=False
workdir=os.getcwd()
arr_module_path={}
if config.session_enabled==True:
#Create dir for sessions
if 'session.data_dir' in config.session_opts:
if not os.path.isdir(config.session_opts['session.data_dir']):
os.makedirs(config.session_opts['session.data_dir'], 0o700, True)
"""
@app.hook('after_request')
def clean_session():
after_session()
"""
def prepare_app():
def print_memory():
@ -46,14 +60,6 @@ def prepare_app():
#app.add_hook('before_request', print_memory)
if config.session_enabled==True:
#Create dir for sessions
if 'session.data_dir' in config.session_opts:
if not os.path.isdir(config.session_opts['session.data_dir']):
os.makedirs(config.session_opts['session.data_dir'], 0o700, True)
set_timezone()

View file

@ -21,7 +21,7 @@ setup(name='paramecio',
url='http://paramecioproject.com/',
packages=['paramecio', 'paramecio.i18n'],
include_package_data=True,
install_requires=['bottle', 'mako', 'mysqlclient', 'sqlalchemy', 'beaker>=1.8.0', 'itsdangerous', 'colorama','cherrypy', 'arrow'],
install_requires=['bottle', 'mako', 'mysqlclient', 'sqlalchemy', 'diskcache', 'itsdangerous', 'colorama','cherrypy', 'arrow'],
entry_points={'console_scripts': [
'paramecio = paramecio.console:start',
]},