Fixes in sessions for avoid problems, now use diskcache for file sessions
This commit is contained in:
parent
41462b3bda
commit
c23b650277
3 changed files with 40 additions and 70 deletions
|
|
@ -6,6 +6,11 @@ from bottle import request, response
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
import fcntl
|
import fcntl
|
||||||
|
import errno
|
||||||
|
import time
|
||||||
|
import shutil
|
||||||
|
import uuid
|
||||||
|
from diskcache import Cache
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
|
|
@ -72,12 +77,6 @@ class ParamecioSession:
|
||||||
def save(self):
|
def save(self):
|
||||||
|
|
||||||
# Here get the function for load session
|
# 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)
|
save_session(self.session['token'], self.session)
|
||||||
|
|
||||||
|
|
@ -118,23 +117,6 @@ def get_session():
|
||||||
|
|
||||||
# Here get the function for load 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)
|
s=load_session(cookie)
|
||||||
|
|
||||||
request.environ['session']=s
|
request.environ['session']=s
|
||||||
|
|
@ -146,7 +128,11 @@ def get_session():
|
||||||
|
|
||||||
return ParamecioSession(s)
|
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
|
import redis
|
||||||
|
|
||||||
|
|
@ -173,54 +159,32 @@ if config.session_opts['session.type']=='redis':
|
||||||
|
|
||||||
r.set(token, json.dumps(session))
|
r.set(token, json.dumps(session))
|
||||||
|
|
||||||
|
def after_session():
|
||||||
|
pass
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
|
cache=Cache(config.session_opts['session.data_dir'])
|
||||||
|
|
||||||
def load_session(token):
|
def load_session(token):
|
||||||
|
|
||||||
# Here get the function for load session
|
# Here get the function for load session
|
||||||
|
|
||||||
path_cookie=config.session_opts['session.data_dir']+'/session_'+token
|
if token in cache:
|
||||||
|
s=json.loads(cache[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)
|
|
||||||
else:
|
else:
|
||||||
s={'token': token}
|
s={'token': token}
|
||||||
else:
|
cache.add(token, json.dumps(s))
|
||||||
# Need regenerate session
|
|
||||||
|
|
||||||
s=generate_session()
|
|
||||||
|
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def save_session(token, session):
|
def save_session(token, session):
|
||||||
|
|
||||||
path_cookie=config.session_opts['session.data_dir']+'/session_'+token
|
cache[token]=json.dumps(session)
|
||||||
|
#pass
|
||||||
with open(path_cookie, 'w') as f:
|
pass
|
||||||
|
|
||||||
#Lock file, if cannot lock wait
|
#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():
|
def generate_session():
|
||||||
s=request.environ.get(config.cookie_name)
|
s=request.environ.get(config.cookie_name)
|
||||||
|
|
@ -235,11 +199,11 @@ def get_session():
|
||||||
return request.environ.get(config.cookie_name)
|
return request.environ.get(config.cookie_name)
|
||||||
#ParamecioSession()
|
#ParamecioSession()
|
||||||
else:
|
else:
|
||||||
return None
|
return ParamecioSession({})
|
||||||
|
|
||||||
except:
|
except:
|
||||||
|
|
||||||
return None
|
return ParamecioSession({})
|
||||||
"""
|
"""
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ from paramecio.citoplasma.datetime import set_timezone
|
||||||
from itsdangerous import JSONWebSignatureSerializer
|
from itsdangerous import JSONWebSignatureSerializer
|
||||||
from paramecio.citoplasma.keyutils import create_key_encrypt, create_key_encrypt_256, create_key
|
from paramecio.citoplasma.keyutils import create_key_encrypt, create_key_encrypt_256, create_key
|
||||||
from paramecio.wsgiapp import app
|
from paramecio.wsgiapp import app
|
||||||
|
#from paramecio.citoplasma.sessions import after_session
|
||||||
|
|
||||||
modules_pass=False
|
modules_pass=False
|
||||||
|
|
||||||
|
|
@ -23,6 +24,19 @@ modules_pass=False
|
||||||
workdir=os.getcwd()
|
workdir=os.getcwd()
|
||||||
arr_module_path={}
|
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 prepare_app():
|
||||||
|
|
||||||
def print_memory():
|
def print_memory():
|
||||||
|
|
@ -46,14 +60,6 @@ def prepare_app():
|
||||||
|
|
||||||
#app.add_hook('before_request', print_memory)
|
#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()
|
set_timezone()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
2
setup.py
2
setup.py
|
|
@ -21,7 +21,7 @@ setup(name='paramecio',
|
||||||
url='http://paramecioproject.com/',
|
url='http://paramecioproject.com/',
|
||||||
packages=['paramecio', 'paramecio.i18n'],
|
packages=['paramecio', 'paramecio.i18n'],
|
||||||
include_package_data=True,
|
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': [
|
entry_points={'console_scripts': [
|
||||||
'paramecio = paramecio.console:start',
|
'paramecio = paramecio.console:start',
|
||||||
]},
|
]},
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue