Mike Looijmans
nlv11281 at natlab.research.philips.com
Fri May 25 02:28:43 EDT 2007
Since I'm the one responsible for the StringField redesign in 3.3, I feel obliged to respond. The suggested changes will break a lot more than they will fix. The strange implementation of the __repr__ functions have been done that way to remain compatible with the existing code. The StringField and Field classes (there used to be only one in mod_python 3.2) were made to be compatible with the CGI version of fields. The StringField can be made picklable by adding a __getstate__ and, if needed, a __setstate__ function, which will not break existing code. Probably, something like this will do (untested code): ... def __getstate__(self): return {'name': self.name, 'value': self.value} ... That is a change that we could commit into the SVN archive i guess. A Field instance (uploaded file with no size limit) should never be pickled - it contains a handle to a file that will be deleted when the current request handler ends. Graham's suggestion to translate the fields into something neutral, i suggest using a dictonary, is simple enough, so I strongly advise taking that route. -- Mike Looijmans Philips Natlab / Topic Automation Graham Dumpleton wrote: > We can look at your changes, but the documentation does say about the > Field class: > > """This class is used internally by FieldStorage and is not meant to > be instantiated by the user.""" > > In other words it is an implementation detail and you perhaps > shouldn't be expecting it to be able to be pickled and unpickled, the > later equating to instantiation by the user. > > You would perhaps be better off using the public API to translate the > form/fields into a neutral format and then doing the pickle on that. > > BTW, I presume you meant 3.3.1 rather than 3.3.10. > > Graham > > On 25/05/07, Luca Montecchiani <l.montecchiani at teamsystem.com> wrote: > >> Hi all, >> >> after a while I figure out all the problems withe the new >> StringField objects and I've cooked a patch that works for me. >> The patch try to fix the following problems: >> >> 1- StringField not pickable anymore with modpython 3.3.10 >> 2- StringField eval() problem with modpython 3.3.10 >> 3- avoid to put the entire file content on Field __repr__ method >> >> please let me know if this could be an acceptable way to address >> all this compatibility problems. >> >> thanks in advance, >> luca >> >> -- >> Luca Montecchiani >> Software Di Base >> TeamSystem S.p.a. >> ------------------------------------------------------------------------------------------ >> >> Informativa ai sensi del D. Lgs. 196-30/06/2003. >> Il contenuto di questa e.mail e degli eventuali allegati, deve essere >> nella disponibilità >> del solo destinatario. Se ricevete per errore questa e-mail siete >> pregati di informarci >> (rispedendola al mittente) e di provvedere alla sua rimozione. >> Possono essere presenti informazioni riservate e non corrette >> (parzialmente o totalmente). >> Le e-mail in partenza e in arrivo possono essere oggetto di monitoraggio >> da parte di Teamsystem spa. Del contenuto è responsabile il mittente >> della presente. >> Chiunque venga in possesso non autorizzato di questa e-mail è vincolato >> dalla Legge a non leggerne il contenuto, a non copiarla, a non >> diffonderla e a non usarla. >> Informiamo che per l' esercizio dei diritti di cui all'art. 7 del >> d.lgs.196/2003 ci si può >> rivolgere al Titolare del trattamento Teamsystem S.r.l. via Gagarin >> 205 61100 PESARO >> per posta o fax, indicando sulla busta o sul foglio la dicitura >> "Inerente alla Privacy", >> o inviando una e-mail all' indirizzo privacy at teamsystem.com . >> ------------------------------------------------------------------------------------------ >> >> >> --- util.py.orig Wed Nov 22 12:15:54 2006 >> +++ util.py Thu May 24 23:06:42 2007 >> @@ -83,7 +83,12 @@ >> >> def __repr__(self): >> """Return printable representation.""" >> - return "Field(%s, %s)" % (`self.name`, `self.value`) >> + if self.file: >> + # avoid to put the entire file content in the >> + # returned string ! >> + return "Field(%s, %s)" % (`self.name`, `self.filename`) >> + else: >> + return "Field(%s, %s)" % (`self.name`, `self.value`) >> >> def __getattr__(self, name): >> if name != 'value': >> @@ -126,8 +131,8 @@ >> return self.file >> >> def __repr__(self): >> - """Return printable representation (to pass unit tests).""" >> - return "Field(%s, %s)" % (`self.name`, `self.value`) >> + # this is necessary if you want to eval a StringField >> + return self.value >> >> class FieldList(list): >> >> @@ -330,15 +335,18 @@ >> if disp_options.has_key("filename"): >> field = Field(name) >> field.filename = disp_options["filename"] >> + # file and headers attributes are only >> + # for Field objects because they will make >> + # a StringField unpickable >> + field.file = file >> + field.headers = headers >> else: >> field = StringField(file.read()) >> field.name = name >> - field.file = file >> field.type = ctype >> field.type_options = type_options >> field.disposition = disp >> field.disposition_options = disp_options >> - field.headers = headers >> self.list.append(field) >> >> def add_field(self, key, value): >> >> _______________________________________________ >> Mod_python mailing list >> Mod_python at modpython.org >> http://mailman.modpython.org/mailman/listinfo/mod_python >> >> > > _______________________________________________ > Mod_python mailing list > Mod_python at modpython.org > http://mailman.modpython.org/mailman/listinfo/mod_python > > -- Mike Looijmans Philips Natlab / Topic Automation
|