Hello I have also proposed a patch to make redis work with my applications under wep2py latest ( 2.18.5-stable+timestamp.2019.04.08.04.22.03) and python3 it is attached to this post. "onetwomany" also released a patch.
Basically 2 files are to be adjusted : redis_session.py and global.py 1/ Redis does not support bool so I replaced False by 0 2/ Redis does not support datetime so I replaced datetime by str(datetime) Under linux and python3, I found out that it was the only way to have the "welcome" application ( and also my own applications) to work in a multinode environment accessing a distributed redis server for session caching. Let us know if it solves your problem. Regards Stephane Le lundi 9 septembre 2019 18:27:20 UTC+2, Joe Barnhart a écrit : > > I sure wish somebody could fix this. It's a real bottleneck to Python3 > adoption for my site. I tried using local storage for sessions but the > limitation on data size makes it a no-go for my site. If I can't use redis > I'll have to drop back to storing sessions in files and that really sucks > for a larger deployment. > > -- Joe > > On Monday, April 1, 2019 at 11:31:10 PM UTC-7, Massimo Di Pierro wrote: >> >> we could change True/False with 1/0 but a better approach would be to >> remove the value within the redis adapter. The value of locked does not do >> anything anyway on redis since it is not a relational database with >> transactions. >> >> On Sunday, 31 March 2019 10:19:20 UTC-7, Jim S wrote: >>> >>> I changed the following in gluon/globals.py and mine is working now. >>> But, I'm unclear on how to test to see if it is handling the locking >>> properly: >>> >>> dd = dict(locked=False, >>> client_ip=response.session_client, >>> modified_datetime=request.now, >>> session_data=session_pickled, >>> unique_key=unique_key) >>> >>> to >>> >>> dd = dict(locked='False', >>> client_ip=response.session_client, >>> modified_datetime=str(request.now), >>> session_data=session_pickled, >>> unique_key=unique_key) >>> >>> This makes all my stuff work (I'm still on Python 2.7 but I think the >>> problem has to do with the python redis client moving to version 3). >>> >>> Leonel - I think this relates back to an issue you commented on late >>> last year. >>> https://groups.google.com/forum/?pli=1#!searchin/web2py/redis%7Csort:date/web2py/PdquGF_9a2E/6VJpLqsnBgAJ >>> >>> At that time I just continued using python redis 2.10.6. But, can't do >>> that forever. Anyone able to test or improve upon the change I made >>> above? Like I said, it works for me, but I don't know how to see if I'm >>> causing any other unforeseen damage. >>> >>> -Jim >>> >>> On Friday, March 29, 2019 at 7:49:03 PM UTC-5, Joe Barnhart wrote: >>>> >>>> Hi Leonel -- >>>> >>>> My brain refuses to put together the words "session locked field". I >>>> understand the part of pickle smashing the values and encoding them as one >>>> string. The bool has something to do with session locking? >>>> >>>> I've only looked at the web2py redis code in the most scant way as I >>>> wasn't planning to become a redis expert. Sessions in redis could be >>>> important to me, tho, so I may need to set aside some time to dig into it. >>>> (Storing sessions in cookies has been problematic due to the limited >>>> space >>>> for cookies in browsers.) >>>> >>>> -- Joe >>>> >>>> >>>> On Wednesday, March 27, 2019 at 4:49:25 PM UTC-7, Leonel Câmara wrote: >>>>> >>>>> It's not your values Joe, pickle serializes them as a string so they >>>>> would be fine. It's web2py session locked field which is True or False. >>>>> It's probably easy to fix this in redis_session.py >>>>> >>>> -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/web2py/9c528ab3-a5cd-4896-a12b-96a40bb972cf%40googlegroups.com.
--- gluon/globals.py 2019-04-08 06:21:31.000000000 +0200 +++ gluon/globals.py 2019-05-31 13:02:35.751156157 +0200 @@ -1050,7 +1050,7 @@ if record_id.isdigit() and long(record_id) > 0: new_unique_key = web2py_uuid() row = table(record_id) - if row and row['unique_key'] == unique_key: + if row and row['unique_key'].decode('utf-8') == unique_key: table._db(table.id == record_id).update(unique_key=new_unique_key) else: record_id = None @@ -1226,9 +1226,9 @@ session_pickled = response.session_pickled or pickle.dumps(self, pickle.HIGHEST_PROTOCOL) - dd = dict(locked=False, + dd = dict(locked=0, client_ip=response.session_client, - modified_datetime=request.now, + modified_datetime=str(request.now), session_data=session_pickled, unique_key=unique_key) if record_id: --- gluon/contrib/redis_session.py 2019-04-08 06:21:31.000000000 +0200 +++ gluon/contrib/redis_session.py 2019-05-31 12:59:13.254940042 +0200 @@ -13,7 +13,6 @@ from gluon.storage import Storage from gluon.contrib.redis_utils import acquire_lock, release_lock from gluon.contrib.redis_utils import register_release_lock -from gluon._compat import to_bytes logger = logging.getLogger("web2py.session.redis") @@ -182,11 +181,11 @@ key = self.keyprefix + ':' + str(self.value) if self.with_lock: acquire_lock(self.db.r_server, key + ':lock', self.value, 2) - rtn = self.db.r_server.hgetall(key) + rtn = {k.decode('utf-8'):v for k,v in self.db.r_server.hgetall(key).items()} if rtn: if self.unique_key: # make sure the id and unique_key are correct - if rtn['unique_key'] == self.unique_key: + if rtn['unique_key'].decode('utf-8') == self.unique_key: rtn['update_record'] = self.update # update record support else: rtn = None