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

Reply via email to