Hidden CGI fields in HTML
Michael P. Reilly
arcege at shore.net
Tue Aug 10 11:26:08 EDT 1999
Oleg Broytmann <phd at emerald.netskate.ru> wrote:
: On Tue, 10 Aug 1999, Ian Clarke wrote:
:> On a related issue, you are clearly experienced in using CGI with
:> Python. I couldn't understand why cgi.FieldStorage returned a
:> dictionary which contained MiniFieldStorage objects (which must be
:> accessed using the .value field) rather than just the data itself. This
:> would be much more convenient as I see it. Any ideas?
: There are, actually, some more issues on using FieldStorage, for
: example, you cannot ask for non-existing field:
: v = form["nofield"].value
: will raise KeyError. And there is no way to emulate dict.get()...
Yes, you can
if form.has_key("nofield"):
if type(form["nofield"]) is type([]):
nofield_value = map(lambda e: e.value, form["nofield"])
else:
nofield_value = form["nofield"].value
else:
nofield_value = None
But see below.
: Oh, yes, I think I know why there is .value! What if your form has more
: than one value for some key? Like in the following GET:
: http://my.server/my/cgi/prog.py?city=Moscow&city=Paris&city=London
: How do you get the value? How do you recognize thera are many values?
: Currently, you try to ask for form["city"], if the field exists you try to
: ask it for .value, but if the .value does not exists, you know it is a
: list:
: for f in form["city"]:
: print f.value
Actually, the reason is more of: what to do about file-uploads, where
you have the filename and the contents being given. The FieldStorage
object will get a "filename" attribute, the opened file will be in
"file", and when you access "value" it will read the data from the
file.
To correct my code snippet above to handle files you have:
# if nofield_value is of type:
# None: field not in form
# list: multiple values
# tuple: tuple of the filename and file object
# string: the string data from the form
def get_field(form, fieldname):
if form.has_key(fieldname):
value = get_field_data(form[fieldname])
else:
value = None
return value
def get_field_data(field):
if type(field) is type([]):
# recursively handle the list (could have list of list of files)
value = map(get_field_data, field)
elif hasattr(field, "file"):
value = (field.filename, field.file)
else:
value = field.value
return value
I suggest reading the comments in Lib/cgi.py for more information.
-Arcege
More information about the Python-list
mailing list