<div dir="ltr"><div>Hi,</div><div><br></div><div>Does Beaker 1.6.4 work on Python3 ?</div><div>Is there anyone using Beaker on Python3?</div><div><br></div><div><br></div><div>I got the following error on Python 3.3:</div>
<div><br></div><div><br></div><div>  File "/opt/lang/python/3.2.2/lib/python3.2/http/cookies.py", line 486, in __setitem__</div><div>    rval, cval = self.value_encode(value)</div><div>  File "/opt/lang/python/3.2.2/lib/python3.2/site-packages/Beaker-1.6.4-py3.2.egg/beaker/session.py", line 70, in value_encode</div>
<div>    sig = HMAC.new(self.secret, val.encode('UTF-8'), SHA1).hexdigest()</div><div>AttributeError: 'bytes' object has no attribute 'encode'</div><div><br></div><div><br></div><div>The following is a monkey patch to avoid this error,</div>
<div>but I'm not sure that it is correct solution.</div><div><br></div><div><br></div><div>    from beaker.crypto import hmac as HMAC, hmac_sha1 as SHA1</div><div>    from beaker.session import SignedCookie</div><div>
    def value_encode(self, val):</div><div>        #sig = HMAC.new(self.secret, val.encode('UTF-8'), SHA1).hexdigest()</div><div>        sig = HMAC.new(self.secret, val, SHA1).hexdigest()</div><div>        return str(val), ("%s%s" % (sig, val))</div>
<div>    SignedCookie.value_encode = value_encode</div><div><br></div><div><br></div><div>And, even with monkey patching, Beaker's SessionMiddleware</div><div>doesn't save session correctly on Python3.</div><div><br>
</div><div><br></div><div>Please help me: I want to run Beaker 1.6.4 on Python 3.</div><div>(Pyton 3.3.3, MacOSX)</div><div><br></div><div>Here is my sample code (which works on Python2.7 very well!):</div><div>------------------------------------------------------</div>
<div># -*- coding: utf-8 -*-</div><div><br></div><div>import sys</div><div>import waitress</div><div>from beaker.middleware import SessionMiddleware</div><div><br></div><div>def testapp(environ, start_response):</div><div>
    session = environ.get('beaker.session')</div><div>    count = session.get('count', 0) + 1</div><div>    session['count'] = count</div><div>    session.save()</div><div>    content = "count=%s" % count</div>
<div>    #</div><div>    start_response('200 OK', [('Content-Type', 'text/plain')])</div><div>    return [content.encode('utf-8')]</div><div><br></div><div>config = {</div><div>    'session.type': 'cookie',</div>
<div>    'session.validate_key': 'mysecretstring',</div><div>}</div><div>app = SessionMiddleware(testapp, config=config)</div><div><br></div><div>## monkey patch for Python3</div><div>python3 = sys.version_info[0] == 3</div>
<div>if 0 and python3:</div><div>    from beaker.crypto import hmac as HMAC, hmac_sha1 as SHA1</div><div>    from beaker.session import SignedCookie</div><div>    def value_encode(self, val):</div><div>        #sig = HMAC.new(self.secret, val.encode('UTF-8'), SHA1).hexdigest()</div>
<div>        sig = HMAC.new(self.secret, val, SHA1).hexdigest()</div><div>        return str(val), ("%s%s" % (sig, val))</div><div>    SignedCookie.value_encode = value_encode</div><div>## ----</div><div><br></div>
<div>waitress.serve(app, port=8080)</div><div>------------------------------------------------------</div><div><br></div><div>--</div><div>regards,</div><div>makoto kuwata</div><div><br></div></div>