[mod_python] Mod_python & cPickle / saving Instances

Graham Dumpleton graham.dumpleton at gmail.com
Tue Apr 1 07:26:09 EDT 2008


On 01/04/2008, Dominique.Holzwarth at ch.delarue.com
<Dominique.Holzwarth at ch.delarue.com> wrote:
> Hello Graham
>
>  I've read your article and just want to clarify if I understood it the right way :-)
>  So basicly instance objects shouldn't (or rather can't) be stored in a session object (and also using pickle directly won't work) due to the new mod_python module importer?

Complex user defined types from code files which are candidates for
mod_python module reloading can't be used.

>  Pickle would work tho, if I add my own modules to the PYTHONPATH (sys.modules thingy) so that they are loaded by the standard python module loader? Is that correct?

Correct. Those in normal Python modules picked up from sys.path can be used.

In general though recommend only using basic Python types,
dictionaries, lists etc. This is though just to avoid potential for
problem, not that there is still a problem. Just make sure stuff you
want to pickle is in modules on sys.path.

>  However, using the standard python module loader for own modules will cause some mod_python problems as stated in http://www.dscpl.com.au/wiki/ModPython/Articles/ModuleImportingIsBroken ?

Which things in particular are you talking about? The problems in that
document refer to pre mod_python 3.3.1. I can't think of any specific
issues with use of standard modules that would cause a problem for you
in mod_python 3.3.1.

Graham

>  If that's really the current state then I guess I have to do some redesign in order to not use instance object serialisation... :-/
>
>  Thanks for the quick answer,
>  Dominique
>
>
>  -----Original Message-----
>  From: Graham Dumpleton [mailto:graham.dumpleton at gmail.com]
>  Sent: Dienstag, 1. April 2008 11:57
>  To: Holzwarth, Dominique (Berne Bauhaus)
>  Cc: mod_python at modpython.org
>  Subject: Re: [mod_python] Mod_python & cPickle / saving Instances
>
>  Read:
>
>   http://www.dscpl.com.au/wiki/ModPython/Articles/IssuesWithSessionObjects
>
>  Graham
>
>  On 01/04/2008, Dominique.Holzwarth at ch.delarue.com
>  <Dominique.Holzwarth at ch.delarue.com> wrote:
>  > Hey Guys
>  >
>  >  I was just playing around with the cPickle module to save some instance objects into binary files and 'offline' (normal python interpreter on local machine) it all works fine. However, when I try to do the same things under apache with mod_python I get a mod_python specific error...
>  >
>  >  Here are my testing files:
>  >
>  >  Pickletest.py
>  >
>  > **********************************************************************
>  > *********************************************
>  >  from mod_python import apache
>  >  from mod_python import Session
>  >  import cPickle, pickle
>  >
>  >  myModule = apache.import_module('~/test/dummyclass.py')
>  >
>  >  secretText = "hallo"
>  >
>  >  def index(req):
>  >     req.session = Session.FileSession(req, secret=secretText)
>  >     if req.session.is_new():
>  >         myInstance = myModule.myClass()
>  >         myInstance.hit()
>  >         hits = str(myInstance.hitCounter)
>  >         myOtherInstance = myModule.myOtherClass()
>  >         myOtherInstance.hit()
>  >         randNum = str(myOtherInstance.randomNumber)
>  >         file = open('C:\\Program Files\\Apache Software Foundation\\Apache2.2\\test\\myInstances.pkl','wb')
>  >         cPickle.dump((myInstance, myOtherInstance), file)
>  >         file.close()
>  >         req.session.save()
>  >         return "Hits: "+hits+" Random Number: "+randNum
>  >     else:
>  >         file = open('C:\\Program Files\\Apache Software Foundation\\Apache2.2\\test\\myInstances.pkl','rb')
>  >         (myInstance, myOtherInstance) = cPickle.load(file)
>  >         file.close()
>  >         myInstance.hit()
>  >         myOtherInstance.hit()
>  >         hits = str(myInstance.hitCounter)
>  >         randNumber = str(myOtherInstance.randomNumber)
>  >         req.session['myInstances'] = (myInstance, myOtherInstance)
>  >         file = open('C:\\Program Files\\Apache Software Foundation\\Apache2.2\\test\\myInstances.pkl','wb')
>  >         cPickle.dump((myInstance, myOtherInstance), file)
>  >         file.close()
>  >         req.session.save()
>  >         return "Hits: "+hits+" Random Number: "+randNum+" old session"
>  >
>  > **********************************************************************
>  > *********************************************
>  >
>  >  This script does nothing more than saving / loading instance objects and displaying some sort of 'hit counter'
>  >
>  >  Dummyclass.py
>  >
>  > **********************************************************************
>  > *********************************************
>  >  import random
>  >
>  >  class myClass:
>  >     def __init__(self):
>  >         self.attribute = 1
>  >         self.text = "hello world"
>  >         self.hitCounter = 0
>  >
>  >     def hit(self):
>  >         self.hitCounter += 1
>  >
>  >  class myOtherClass:
>  >     def __init__(self):
>  >         self.otherAttribute = 2
>  >         self.otherText = "goodbye world"
>  >         self.randomNumber = 0
>  >
>  >     def hit(self):
>  >         self.randomNumber = random.randint(0, 1000)
>  >
>  > **********************************************************************
>  > *********************************************
>  >  Defines some useless classes, of which instance objects should be
>  > stored :-)
>  >
>  >  The script manages to write the *.pkl file which looks like this:
>  >
>  >  myInstances.pkl
>  >
>  > **********************************************************************
>  > *********************************************
>  >  ((i_mp_bee88a136571a696398a0eb82b06eeb3
>  >  myClass
>  >  p1
>  >  (dp2
>  >  S'attribute'
>  >  p3
>  >  I1
>  >  sS'hitCounter'
>  >  p4
>  >  I1
>  >  sS'text'
>  >  p5
>  >  S'hello world'
>  >  p6
>  >  sb(i_mp_bee88a136571a696398a0eb82b06eeb3
>  >  myOtherClass
>  >  p7
>  >  (dp8
>  >  S'otherText'
>  >  p9
>  >  S'goodbye world'
>  >  p10
>  >  sS'otherAttribute'
>  >  p11
>  >  I2
>  >  sS'randomNumber'
>  >  p12
>  >  I105
>  >  sbt.
>  >
>  > **********************************************************************
>  > *********************************************
>  >
>  >  As I understand the pickle-algorithm this file looks as intended except for the i_mp_bee88a136571a696398a0eb82b06eeb3 which normaly would be the name of the module. Obviously the module name is converted into some mod_python GUID thingy...
>  >
>  >  The error message i get is the following:
>  >
>  >  MOD_PYTHON ERROR
>  >
>  >  ProcessId:      3784
>  >  Interpreter:    'xx'
>  >
>  >  ServerName:     'xx'
>  >  DocumentRoot:   'C:/Program Files/Apache Software Foundation/Apache2.2/htdocs'
>  >
>  >  URI:            '/python/test/pickletest.py'
>  >  Location:       None
>  >  Directory:      'C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/python/'
>  >  Filename:       'C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\python\\test\\pickletest.py'
>  >  PathInfo:       ''
>  >
>  >  Phase:          'PythonHandler'
>  >  Handler:        'mod_python.publisher'
>  >
>  >  Traceback (most recent call last):
>  >
>  >   File "C:\Program Files\Python25\lib\site-packages\mod_python\importer.py", line 1537, in HandlerDispatch
>  >     default=default_handler, arg=req, silent=hlist.silent)
>  >
>  >   File "C:\Program Files\Python25\lib\site-packages\mod_python\importer.py", line 1229, in _process_target
>  >     result = _execute_target(config, req, object, arg)
>  >
>  >   File "C:\Program Files\Python25\lib\site-packages\mod_python\importer.py", line 1128, in _execute_target
>  >     result = object(arg)
>  >
>  >   File "C:\Program Files\Python25\lib\site-packages\mod_python\publisher.py", line 213, in handler
>  >     published = publish_object(req, object)
>  >
>  >   File "C:\Program Files\Python25\lib\site-packages\mod_python\publisher.py", line 425, in publish_object
>  >     return publish_object(req,util.apply_fs_data(object, req.form,
>  > req=req))
>  >
>  >   File "C:\Program Files\Python25\lib\site-packages\mod_python\util.py", line 554, in apply_fs_data
>  >     return object(**args)
>  >
>  >   File "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\python\test\pickletest.py", line 25, in index
>  >     (myInstance, myOtherInstance) = cPickle.load(file)
>  >
>  >  ImportError: No module named _mp_bee88a136571a696398a0eb82b06eeb3
>  >
>  >
>  >  MODULE CACHE DETAILS
>  >
>  >  Accessed:       Tue Apr 01 11:05:33 2008
>  >  Generation:     26
>  >
>  >  _mp_bee88a136571a696398a0eb82b06eeb3 {
>  >   FileName:     'C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\python\\test\\dummyclass.py'
>  >   Instance:     1
>  >   Generation:   13
>  >   Modified:     Tue Apr 01 09:59:54 2008
>  >   Imported:     Tue Apr 01 10:05:22 2008
>  >  }
>  >
>  >  _mp_754c5030ce462c9ea7741cb6f66d6cc1 {
>  >   FileName:     'C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\python\\test\\pickletest.py'
>  >   Instance:     13
>  >   Generation:   26
>  >   Modified:     Tue Apr 01 10:56:58 2008
>  >   Imported:     Tue Apr 01 10:57:10 2008
>  >   Children:     'C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\python\\test\\dummyclass.py'
>  >  }
>  >
>  >  Is there a way how to use cPickle AND mod_python together? I also
>  > tried to use the session mechanism instead of the pickle mechanism to
>  > store instance objects in a binary file but that doesn't seem to work
>  > either (if I do a req.session['myInstances'] = (myInstance,
>  > myOtherInstance) then the session doesn't seem to be saved properly
>  > and thus, everytime I hit on browser-reload a new session is
>  > generated...)
>  >
>  >  Would be really great if someone could help me with this!
>  >
>  >  Greetings Dominique
>  >
>  >
>  >  _______________________________________________
>  >  Mod_python mailing list
>  >  Mod_python at modpython.org
>  >  http://mailman.modpython.org/mailman/listinfo/mod_python
>  >
>
>
>


More information about the Mod_python mailing list