annotate Lib/cgi.py @ 3720:b341def4eef8 legacy-trunk

Ignore latex intermediate products.
author Guido van Rossum <guido@python.org>
date Wed, 26 Jun 1996 19:30:01 +0000
parents 2eb7e9e236bf
children d1c47f4f1541
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 #!/usr/local/bin/python
3106
c41a8e501973 handle missing QUERY_STRING
Guido van Rossum <guido@python.org>
parents: 2918
diff changeset
2
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
3 """Support module for CGI (Common Gateway Interface) scripts.
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
4
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
5 This module defines a number of utilities for use by CGI scripts
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
6 written in Python.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
7
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
8
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
9 Introduction
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
10 ------------
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
11
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
12 A CGI script is invoked by an HTTP server, usually to process user
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
13 input submitted through an HTML <FORM> or <ISINPUT> element.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
14
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
15 Most often, CGI scripts live in the server's special cgi-bin
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
16 directory. The HTTP server places all sorts of information about the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
17 request (such as the client's hostname, the requested URL, the query
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
18 string, and lots of other goodies) in the script's shell environment,
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
19 executes the script, and sends the script's output back to the client.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
20
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
21 The script's input is connected to the client too, and sometimes the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
22 form data is read this way; at other times the form data is passed via
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
23 the "query string" part of the URL. This module (cgi.py) is intended
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
24 to take care of the different cases and provide a simpler interface to
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
25 the Python script. It also provides a number of utilities that help
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
26 in debugging scripts, and the latest addition is support for file
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
27 uploads from a form (if your browser supports it -- Grail 0.3 and
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
28 Netscape 2.0 do).
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
29
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
30 The output of a CGI script should consist of two sections, separated
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
31 by a blank line. The first section contains a number of headers,
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
32 telling the client what kind of data is following. Python code to
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
33 generate a minimal header section looks like this:
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
34
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
35 print "Content-type: text/html" # HTML is following
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
36 print # blank line, end of headers
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
37
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
38 The second section is usually HTML, which allows the client software
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
39 to display nicely formatted text with header, in-line images, etc.
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
40 Here's Python code that prints a simple piece of HTML:
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
41
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
42 print "<TITLE>CGI script output</TITLE>"
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
43 print "<H1>This is my first CGI script</H1>"
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
44 print "Hello, world!"
3106
c41a8e501973 handle missing QUERY_STRING
Guido van Rossum <guido@python.org>
parents: 2918
diff changeset
45
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
46 (It may not be fully legal HTML according to the letter of the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
47 standard, but any browser will understand it.)
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
48
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
49
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
50 Using the cgi module
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
51 --------------------
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
52
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
53 Begin by writing "import cgi". Don't use "from cgi import *" -- the
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
54 module defines all sorts of names for its own use or for backward
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
55 compatibility that you don't want in your namespace.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
56
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
57 It's best to use the FieldStorage class. The other classes define in this
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
58 module are provided mostly for backward compatibility. Instantiate it
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
59 exactly once, without arguments. This reads the form contents from
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
60 standard input or the environment (depending on the value of various
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
61 environment variables set according to the CGI standard). Since it may
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
62 consume standard input, it should be instantiated only once.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
63
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
64 The FieldStorage instance can be accessed as if it were a Python
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
65 dictionary. For instance, the following code (which assumes that the
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
66 Content-type header and blank line have already been printed) checks that
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
67 the fields "name" and "addr" are both set to a non-empty string:
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
68
3629
e54d39107249 capitalize H3 headers; add 'cgi.' prefix to example code
Guido van Rossum <guido@python.org>
parents: 3451
diff changeset
69 form = cgi.FieldStorage()
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
70 form_ok = 0
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
71 if form.has_key("name") and form.has_key("addr"):
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
72 if form["name"].value != "" and form["addr"].value != "":
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
73 form_ok = 1
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
74 if not form_ok:
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
75 print "<H1>Error</H1>"
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
76 print "Please fill in the name and addr fields."
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
77 return
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
78 ...further form processing here...
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
79
3447
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
80 Here the fields, accessed through form[key], are themselves instances
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
81 of FieldStorage (or MiniFieldStorage, depending on the form encoding).
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
82
3447
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
83 If the submitted form data contains more than one field with the same
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
84 name, the object retrieved by form[key] is not a (Mini)FieldStorage
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
85 instance but a list of such instances. If you expect this possibility
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
86 (i.e., when your HTML form comtains multiple fields with the same
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
87 name), use the type() function to determine whether you have a single
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
88 instance or a list of instances. For example, here's code that
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
89 concatenates any number of username fields, separated by commas:
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
90
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
91 username = form["username"]
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
92 if type(username) is type([]):
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
93 # Multiple username fields specified
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
94 usernames = ""
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
95 for item in username:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
96 if usernames:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
97 # Next item -- insert comma
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
98 usernames = usernames + "," + item.value
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
99 else:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
100 # First item -- don't insert comma
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
101 usernames = item.value
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
102 else:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
103 # Single username field specified
3447
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
104 usernames = username.value
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
105
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
106 If a field represents an uploaded file, the value attribute reads the
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
107 entire file in memory as a string. This may not be what you want. You can
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
108 test for an uploaded file by testing either the filename attribute or the
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
109 file attribute. You can then read the data at leasure from the file
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
110 attribute:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
111
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
112 fileitem = form["userfile"]
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
113 if fileitem.file:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
114 # It's an uploaded file; count lines
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
115 linecount = 0
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
116 while 1:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
117 line = fileitem.file.readline()
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
118 if not line: break
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
119 linecount = linecount + 1
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
120
3447
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
121 The file upload draft standard entertains the possibility of uploading
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
122 multiple files from one field (using a recursive multipart/*
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
123 encoding). When this occurs, the item will be a dictionary-like
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
124 FieldStorage item. This can be determined by testing its type
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
125 attribute, which should have the value "multipart/form-data" (or
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
126 perhaps another string beginning with "multipart/"). It this case, it
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
127 can be iterated over recursively just like the top-level form object.
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
128
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
129 When a form is submitted in the "old" format (as the query string or as a
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
130 single data part of type application/x-www-form-urlencoded), the items
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
131 will actually be instances of the class MiniFieldStorage. In this case,
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
132 the list, file and filename attributes are always None.
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
133
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
134
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
135 Old classes
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
136 -----------
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
137
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
138 These classes, present in earlier versions of the cgi module, are still
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
139 supported for backward compatibility. New applications should use the
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
140
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
141 SvFormContentDict: single value form content as dictionary; assumes each
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
142 field name occurs in the form only once.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
143
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
144 FormContentDict: multiple value form content as dictionary (the form
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
145 items are lists of values). Useful if your form contains multiple
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
146 fields with the same name.
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
147
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
148 Other classes (FormContent, InterpFormContentDict) are present for
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
149 backwards compatibility with really old applications only. If you still
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
150 use these and would be inconvenienced when they disappeared from a next
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
151 version of this module, drop me a note.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
152
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
153
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
154 Functions
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
155 ---------
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
156
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
157 These are useful if you want more control, or if you want to employ
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
158 some of the algorithms implemented in this module in other
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
159 circumstances.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
160
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
161 parse(fp): parse a form into a Python dictionary.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
162
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
163 parse_qs(qs): parse a query string (data of type
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
164 application/x-www-form-urlencoded).
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
165
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
166 parse_multipart(fp, pdict): parse input of type multipart/form-data (for
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
167 file uploads).
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
168
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
169 parse_header(string): parse a header like Content-type into a main
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
170 value and a dictionary of parameters.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
171
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
172 test(): complete test program.
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
173
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
174 print_environ(): format the shell environment in HTML.
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
175
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
176 print_form(form): format a form in HTML.
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
177
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
178 print_environ_usage(): print a list of useful environment variables in
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
179 HTML.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
180
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
181 escape(): convert the characters "&", "<" and ">" to HTML-safe
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
182 sequences. Use this if you need to display text that might contain
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
183 such characters in HTML. To translate URLs for inclusion in the HREF
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
184 attribute of an <A> tag, use urllib.quote().
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
185
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
186
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
187 Caring about security
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
188 ---------------------
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
189
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
190 There's one important rule: if you invoke an external program (e.g.
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
191 via the os.system() or os.popen() functions), make very sure you don't
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
192 pass arbitrary strings received from the client to the shell. This is
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
193 a well-known security hole whereby clever hackers anywhere on the web
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
194 can exploit a gullible CGI script to invoke arbitrary shell commands.
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
195 Even parts of the URL or field names cannot be trusted, since the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
196 request doesn't have to come from your form!
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
197
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
198 To be on the safe side, if you must pass a string gotten from a form
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
199 to a shell command, you should make sure the string contains only
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
200 alphanumeric characters, dashes, underscores, and periods.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
201
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
202
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
203 Installing your CGI script on a Unix system
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
204 -------------------------------------------
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
205
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
206 Read the documentation for your HTTP server and check with your local
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
207 system administrator to find the directory where CGI scripts should be
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
208 installed; usually this is in a directory cgi-bin in the server tree.
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
209
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
210 Make sure that your script is readable and executable by "others"; the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
211 Unix file mode should be 755 (use "chmod 755 filename"). Make sure
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
212 that the first line of the script contains "#!" starting in column 1
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
213 followed by the pathname of the Python interpreter, for instance:
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
214
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
215 #!/usr/local/bin/python
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
216
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
217 Make sure the Python interpreter exists and is executable by "others".
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
218
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
219 Make sure that any files your script needs to read or write are
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
220 readable or writable, respectively, by "others" -- their mode should
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
221 be 644 for readable and 666 for writable. This is because, for
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
222 security reasons, the HTTP server executes your script as user
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
223 "nobody", without any special privileges. It can only read (write,
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
224 execute) files that everybody can read (write, execute). The current
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
225 directory at execution time is also different (it is usually the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
226 server's cgi-bin directory) and the set of environment variables is
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
227 also different from what you get at login. in particular, don't count
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
228 on the shell's search path for executables ($PATH) or the Python
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
229 module search path ($PYTHONPATH) to be set to anything interesting.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
230
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
231 If you need to load modules from a directory which is not on Python's
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
232 default module search path, you can change the path in your script,
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
233 before importing other modules, e.g.:
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
234
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
235 import sys
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
236 sys.path.insert(0, "/usr/home/joe/lib/python")
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
237 sys.path.insert(0, "/usr/local/lib/python")
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
238
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
239 (This way, the directory inserted last will be searched first!)
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
240
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
241 Instructions for non-Unix systems will vary; check your HTTP server's
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
242 documentation (it will usually have a section on CGI scripts).
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
243
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
244
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
245 Testing your CGI script
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
246 -----------------------
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
247
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
248 Unfortunately, a CGI script will generally not run when you try it
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
249 from the command line, and a script that works perfectly from the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
250 command line may fail mysteriously when run from the server. There's
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
251 one reason why you should still test your script from the command
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
252 line: if it contains a syntax error, the python interpreter won't
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
253 execute it at all, and the HTTP server will most likely send a cryptic
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
254 error to the client.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
255
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
256 Assuming your script has no syntax errors, yet it does not work, you
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
257 have no choice but to read the next section:
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
258
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
259
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
260 Debugging CGI scripts
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
261 ---------------------
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
262
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
263 First of all, check for trivial installation errors -- reading the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
264 section above on installing your CGI script carefully can save you a
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
265 lot of time. If you wonder whether you have understood the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
266 installation procedure correctly, try installing a copy of this module
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
267 file (cgi.py) as a CGI script. When invoked as a script, the file
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
268 will dump its environment and the contents of the form in HTML form.
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
269 Give it the right mode etc, and send it a request. If it's installed
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
270 in the standard cgi-bin directory, it should be possible to send it a
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
271 request by entering a URL into your browser of the form:
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
272
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
273 http://yourhostname/cgi-bin/cgi.py?name=Joe+Blow&addr=At+Home
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
274
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
275 If this gives an error of type 404, the server cannot find the script
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
276 -- perhaps you need to install it in a different directory. If it
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
277 gives another error (e.g. 500), there's an installation problem that
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
278 you should fix before trying to go any further. If you get a nicely
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
279 formatted listing of the environment and form content (in this
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
280 example, the fields should be listed as "addr" with value "At Home"
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
281 and "name" with value "Joe Blow"), the cgi.py script has been
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
282 installed correctly. If you follow the same procedure for your own
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
283 script, you should now be able to debug it.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
284
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
285 The next step could be to call the cgi module's test() function from
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
286 your script: replace its main code with the single statement
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
287
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
288 cgi.test()
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
289
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
290 This should produce the same results as those gotten from installing
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
291 the cgi.py file itself.
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
292
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
293 When an ordinary Python script raises an unhandled exception
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
294 (e.g. because of a typo in a module name, a file that can't be opened,
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
295 etc.), the Python interpreter prints a nice traceback and exits.
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
296 While the Python interpreter will still do this when your CGI script
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
297 raises an exception, most likely the traceback will end up in one of
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
298 the HTTP server's log file, or be discarded altogether.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
299
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
300 Fortunately, once you have managed to get your script to execute
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
301 *some* code, it is easy to catch exceptions and cause a traceback to
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
302 be printed. The test() function below in this module is an example.
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
303 Here are the rules:
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
304
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
305 1. Import the traceback module (before entering the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
306 try-except!)
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
307
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
308 2. Make sure you finish printing the headers and the blank
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
309 line early
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
310
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
311 3. Assign sys.stderr to sys.stdout
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
312
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
313 3. Wrap all remaining code in a try-except statement
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
314
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
315 4. In the except clause, call traceback.print_exc()
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
316
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
317 For example:
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
318
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
319 import sys
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
320 import traceback
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
321 print "Content-type: text/html"
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
322 print
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
323 sys.stderr = sys.stdout
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
324 try:
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
325 ...your code here...
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
326 except:
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
327 print "\n\n<PRE>"
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
328 traceback.print_exc()
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
329
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
330 Notes: The assignment to sys.stderr is needed because the traceback
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
331 prints to sys.stderr. The print "\n\n<PRE>" statement is necessary to
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
332 disable the word wrapping in HTML.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
333
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
334 If you suspect that there may be a problem in importing the traceback
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
335 module, you can use an even more robust approach (which only uses
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
336 built-in modules):
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
337
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
338 import sys
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
339 sys.stderr = sys.stdout
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
340 print "Content-type: text/plain"
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
341 print
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
342 ...your code here...
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
343
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
344 This relies on the Python interpreter to print the traceback. The
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
345 content type of the output is set to plain text, which disables all
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
346 HTML processing. If your script works, the raw HTML will be displayed
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
347 by your client. If it raises an exception, most likely after the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
348 first two lines have been printed, a traceback will be displayed.
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
349 Because no HTML interpretation is going on, the traceback will
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
350 readable.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
351
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
352 Good luck!
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
353
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
354
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
355 Common problems and solutions
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
356 -----------------------------
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
357
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
358 - Most HTTP servers buffer the output from CGI scripts until the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
359 script is completed. This means that it is not possible to display a
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
360 progress report on the client's display while the script is running.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
361
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
362 - Check the installation instructions above.
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
363
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
364 - Check the HTTP server's log files. ("tail -f logfile" in a separate
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
365 window may be useful!)
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
366
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
367 - Always check a script for syntax errors first, by doing something
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
368 like "python script.py".
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
369
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
370 - When using any of the debugging techniques, don't forget to add
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
371 "import sys" to the top of the script.
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
372
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
373 - When invoking external programs, make sure they can be found.
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
374 Usually, this means using absolute path names -- $PATH is usually not
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
375 set to a very useful value in a CGI script.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
376
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
377 - When reading or writing external files, make sure they can be read
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
378 or written by every user on the system.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
379
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
380 - Don't try to give a CGI script a set-uid mode. This doesn't work on
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
381 most systems, and is a security liability as well.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
382
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
383
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
384 History
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
385 -------
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
386
3435
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
387 Michael McLay started this module. Steve Majewski changed the
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
388 interface to SvFormContentDict and FormContentDict. The multipart
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
389 parsing was inspired by code submitted by Andreas Paepcke. Guido van
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
390 Rossum rewrote, reformatted and documented the module and is currently
f72050dd61a9 Reformatting only.
Guido van Rossum <guido@python.org>
parents: 3432
diff changeset
391 responsible for its maintenance.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
392
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
393
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
394 XXX The module is getting pretty heavy with all those docstrings.
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
395 Perhaps there should be a slimmed version that doesn't contain all those
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
396 backwards compatible and debugging classes and functions?
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
397
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
398 """
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
399
3630
2eb7e9e236bf bump version (sorry)
Guido van Rossum <guido@python.org>
parents: 3629
diff changeset
400 __version__ = "2.0b1"
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
401
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
402
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
403 # Imports
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
404 # =======
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
405
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
406 import string
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
407 import sys
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
408 import os
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
409
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
410
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
411 # A shorthand for os.environ
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
412 environ = os.environ
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
413
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
414
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
415 # Parsing functions
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
416 # =================
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
417
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
418 def parse(fp=None):
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
419 """Parse a query in the environment or from a file (default stdin)"""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
420 if not fp:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
421 fp = sys.stdin
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
422 if not environ.has_key('REQUEST_METHOD'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
423 environ['REQUEST_METHOD'] = 'GET' # For testing stand-alone
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
424 if environ['REQUEST_METHOD'] == 'POST':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
425 ctype, pdict = parse_header(environ['CONTENT_TYPE'])
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
426 if ctype == 'multipart/form-data':
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
427 return parse_multipart(fp, pdict)
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
428 elif ctype == 'application/x-www-form-urlencoded':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
429 clength = string.atoi(environ['CONTENT_LENGTH'])
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
430 qs = fp.read(clength)
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 else:
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
432 qs = '' # Unknown content-type
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
433 environ['QUERY_STRING'] = qs # XXX Shouldn't, really
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
434 elif environ.has_key('QUERY_STRING'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
435 qs = environ['QUERY_STRING']
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
436 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
437 if sys.argv[1:]:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
438 qs = sys.argv[1]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
439 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
440 qs = ""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
441 environ['QUERY_STRING'] = qs # XXX Shouldn't, really
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
442 return parse_qs(qs)
2918
cfa9b3a84872 added parse_qs(query_string)
Guido van Rossum <guido@python.org>
parents: 2538
diff changeset
443
cfa9b3a84872 added parse_qs(query_string)
Guido van Rossum <guido@python.org>
parents: 2538
diff changeset
444
cfa9b3a84872 added parse_qs(query_string)
Guido van Rossum <guido@python.org>
parents: 2538
diff changeset
445 def parse_qs(qs):
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
446 """Parse a query given as a string argument"""
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
447 import urllib, regsub
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
448 name_value_pairs = string.splitfields(qs, '&')
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
449 dict = {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
450 for name_value in name_value_pairs:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
451 nv = string.splitfields(name_value, '=')
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
452 if len(nv) != 2:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
453 continue
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
454 name = nv[0]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
455 value = urllib.unquote(regsub.gsub('+', ' ', nv[1]))
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
456 if len(value):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
457 if dict.has_key (name):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
458 dict[name].append(value)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
459 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
460 dict[name] = [value]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
461 return dict
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
462
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
463
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
464 def parse_multipart(fp, pdict):
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
465 """Parse multipart input.
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
466
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
467 Arguments:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
468 fp : input file
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
469 pdict: dictionary containing other parameters of conten-type header
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
470
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
471 Returns a dictionary just like parse_qs(): keys are the field names, each
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
472 value is a list of values for that field. This is easy to use but not
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
473 much good if you are expecting megabytes to be uploaded -- in that case,
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
474 use the FieldStorage class instead which is much more flexible. Note
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
475 that content-type is the raw, unparsed contents of the content-type
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
476 header.
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
477
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
478 XXX This does not parse nested multipart parts -- use FieldStorage for
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
479 that.
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
480
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
481 XXX This should really be subsumed by FieldStorage altogether -- no
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
482 point in having two implementations of the same parsing algorithm.
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
483
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
484 """
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
485 import mimetools
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
486 if pdict.has_key('boundary'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
487 boundary = pdict['boundary']
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
488 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
489 boundary = ""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
490 nextpart = "--" + boundary
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
491 lastpart = "--" + boundary + "--"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
492 partdict = {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
493 terminator = ""
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
494
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
495 while terminator != lastpart:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
496 bytes = -1
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
497 data = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
498 if terminator:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
499 # At start of next part. Read headers first.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
500 headers = mimetools.Message(fp)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
501 clength = headers.getheader('content-length')
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
502 if clength:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
503 try:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
504 bytes = string.atoi(clength)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
505 except string.atoi_error:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
506 pass
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
507 if bytes > 0:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
508 data = fp.read(bytes)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
509 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
510 data = ""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
511 # Read lines until end of part.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
512 lines = []
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
513 while 1:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
514 line = fp.readline()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
515 if not line:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
516 terminator = lastpart # End outer loop
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
517 break
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
518 if line[:2] == "--":
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
519 terminator = string.strip(line)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
520 if terminator in (nextpart, lastpart):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
521 break
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
522 if line[-2:] == '\r\n':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
523 line = line[:-2]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
524 elif line[-1:] == '\n':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
525 line = line[:-1]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
526 lines.append(line)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
527 # Done with part.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
528 if data is None:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
529 continue
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
530 if bytes < 0:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
531 data = string.joinfields(lines, "\n")
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
532 line = headers['content-disposition']
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
533 if not line:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
534 continue
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
535 key, params = parse_header(line)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
536 if key != 'form-data':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
537 continue
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
538 if params.has_key('name'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
539 name = params['name']
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
540 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
541 continue
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
542 if partdict.has_key(name):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
543 partdict[name].append(data)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
544 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
545 partdict[name] = [data]
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
546
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
547 return partdict
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
548
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
549
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
550 def parse_header(line):
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
551 """Parse a Content-type like header.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
552
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
553 Return the main content-type and a dictionary of options.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
554
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
555 """
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
556 plist = map(string.strip, string.splitfields(line, ';'))
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
557 key = string.lower(plist[0])
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
558 del plist[0]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
559 pdict = {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
560 for p in plist:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
561 i = string.find(p, '=')
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
562 if i >= 0:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
563 name = string.lower(string.strip(p[:i]))
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
564 value = string.strip(p[i+1:])
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
565 if len(value) >= 2 and value[0] == value[-1] == '"':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
566 value = value[1:-1]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
567 pdict[name] = value
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
568 return key, pdict
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
569
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
570
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
571 # Classes for field storage
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
572 # =========================
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
573
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
574 class MiniFieldStorage:
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
575
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
576 """Like FieldStorage, for use when no file uploads are possible."""
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
577
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
578 # Dummy attributes
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
579 filename = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
580 list = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
581 type = None
3447
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
582 type_options = {}
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
583 disposition = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
584 disposition_options = {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
585 headers = {}
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
586
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
587 def __init__(self, name, value):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
588 """Constructor from field name and value."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
589 from StringIO import StringIO
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
590 self.name = name
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
591 self.value = value
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
592 self.file = StringIO(value)
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
593
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
594 def __repr__(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
595 """Return printable representation."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
596 return "MiniFieldStorage(%s, %s)" % (`self.name`, `self.value`)
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
597
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
598
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
599 class FieldStorage:
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
600
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
601 """Store a sequence of fields, reading multipart/form-data.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
602
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
603 This class provides naming, typing, files stored on disk, and
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
604 more. At the top level, it is accessible like a dictionary, whose
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
605 keys are the field names. (Note: None can occur as a field name.)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
606 The items are either a Python list (if there's multiple values) or
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
607 another FieldStorage or MiniFieldStorage object. If it's a single
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
608 object, it has the following attributes:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
609
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
610 name: the field name, if specified; otherwise None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
611
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
612 filename: the filename, if specified; otherwise None; this is the
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
613 client side filename, *not* the file name on which it is
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
614 stored (that's a temporary file you don't deal with)
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
615
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
616 value: the value as a *string*; for file uploads, this
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
617 transparently reads the file every time you request the value
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
618
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
619 file: the file(-like) object from which you can read the data;
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
620 None if the data is stored a simple string
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
621
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
622 type: the content-type, or None if not specified
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
623
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
624 type_options: dictionary of options specified on the content-type
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
625 line
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
626
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
627 disposition: content-disposition, or None if not specified
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
628
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
629 disposition_options: dictionary of corresponding options
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
630
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
631 headers: a dictionary(-like) object (sometimes rfc822.Message or a
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
632 subclass thereof) containing *all* headers
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
633
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
634 The class is subclassable, mostly for the purpose of overriding
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
635 the make_file() method, which is called internally to come up with
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
636 a file open for reading and writing. This makes it possible to
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
637 override the default choice of storing all files in a temporary
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
638 directory and unlinking them as soon as they have been opened.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
639
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
640 """
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
641
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
642 def __init__(self, fp=None, headers=None, outerboundary=""):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
643 """Constructor. Read multipart/* until last part.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
644
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
645 Arguments, all optional:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
646
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
647 fp : file pointer; default: sys.stdin
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
648
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
649 headers : header dictionary-like object; default:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
650 taken from environ as per CGI spec
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
651
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
652 outerboundary : optional terminating multipart boundary
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
653 (for internal use only)
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
654
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
655 """
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
656 method = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
657 if environ.has_key('REQUEST_METHOD'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
658 method = string.upper(environ['REQUEST_METHOD'])
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
659 if not fp and method == 'GET':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
660 qs = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
661 if environ.has_key('QUERY_STRING'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
662 qs = environ['QUERY_STRING']
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
663 from StringIO import StringIO
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
664 fp = StringIO(qs or "")
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
665 if headers is None:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
666 headers = {'content-type':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
667 "application/x-www-form-urlencoded"}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
668 if headers is None:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
669 headers = {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
670 if environ.has_key('CONTENT_TYPE'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
671 headers['content-type'] = environ['CONTENT_TYPE']
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
672 if environ.has_key('CONTENT_LENGTH'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
673 headers['content-length'] = environ['CONTENT_LENGTH']
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
674 self.fp = fp or sys.stdin
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
675 self.headers = headers
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
676 self.outerboundary = outerboundary
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
677
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
678 # Process content-disposition header
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
679 cdisp, pdict = "", {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
680 if self.headers.has_key('content-disposition'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
681 cdisp, pdict = parse_header(self.headers['content-disposition'])
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
682 self.disposition = cdisp
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
683 self.disposition_options = pdict
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
684 self.name = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
685 if pdict.has_key('name'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
686 self.name = pdict['name']
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
687 self.filename = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
688 if pdict.has_key('filename'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
689 self.filename = pdict['filename']
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
690
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
691 # Process content-type header
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
692 ctype, pdict = "text/plain", {}
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
693 if self.headers.has_key('content-type'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
694 ctype, pdict = parse_header(self.headers['content-type'])
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
695 self.type = ctype
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
696 self.type_options = pdict
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
697 self.innerboundary = ""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
698 if pdict.has_key('boundary'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
699 self.innerboundary = pdict['boundary']
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
700 clen = -1
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
701 if self.headers.has_key('content-length'):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
702 try:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
703 clen = string.atoi(self.headers['content-length'])
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
704 except:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
705 pass
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
706 self.length = clen
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
707
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
708 self.list = self.file = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
709 self.done = 0
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
710 self.lines = []
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
711 if ctype == 'application/x-www-form-urlencoded':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
712 self.read_urlencoded()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
713 elif ctype[:10] == 'multipart/':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
714 self.read_multi()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
715 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
716 self.read_single()
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
717
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
718 def __repr__(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
719 """Return a printable representation."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
720 return "FieldStorage(%s, %s, %s)" % (
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
721 `self.name`, `self.filename`, `self.value`)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
722
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
723 def __getattr__(self, name):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
724 if name != 'value':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
725 raise AttributeError, name
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
726 if self.file:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
727 self.file.seek(0)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
728 value = self.file.read()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
729 self.file.seek(0)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
730 elif self.list is not None:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
731 value = self.list
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
732 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
733 value = None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
734 return value
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
735
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
736 def __getitem__(self, key):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
737 """Dictionary style indexing."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
738 if self.list is None:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
739 raise TypeError, "not indexable"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
740 found = []
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
741 for item in self.list:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
742 if item.name == key: found.append(item)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
743 if not found:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
744 raise KeyError, key
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
745 if len(found) == 1:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
746 return found[0]
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
747 else:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
748 return found
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
749
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
750 def keys(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
751 """Dictionary style keys() method."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
752 if self.list is None:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
753 raise TypeError, "not indexable"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
754 keys = []
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
755 for item in self.list:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
756 if item.name not in keys: keys.append(item.name)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
757 return keys
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
758
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
759 def has_key(self, key):
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
760 """Dictionary style has_key() method."""
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
761 if self.list is None:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
762 raise TypeError, "not indexable"
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
763 for item in self.list:
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
764 if item.name == key: return 1
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
765 return 0
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
766
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
767 def read_urlencoded(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
768 """Internal: read data in query string format."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
769 qs = self.fp.read(self.length)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
770 dict = parse_qs(qs)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
771 self.list = []
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
772 for key, valuelist in dict.items():
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
773 for value in valuelist:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
774 self.list.append(MiniFieldStorage(key, value))
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
775 self.skip_lines()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
776
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
777 def read_multi(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
778 """Internal: read a part that is itself multipart."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
779 import rfc822
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
780 self.list = []
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
781 part = self.__class__(self.fp, {}, self.innerboundary)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
782 # Throw first part away
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
783 while not part.done:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
784 headers = rfc822.Message(self.fp)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
785 part = self.__class__(self.fp, headers, self.innerboundary)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
786 self.list.append(part)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
787 self.skip_lines()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
788
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
789 def read_single(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
790 """Internal: read an atomic part."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
791 if self.length >= 0:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
792 self.read_binary()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
793 self.skip_lines()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
794 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
795 self.read_lines()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
796 self.file.seek(0)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
797
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
798 bufsize = 8*1024 # I/O buffering size for copy to file
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
799
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
800 def read_binary(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
801 """Internal: read binary data."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
802 self.file = self.make_file('b')
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
803 todo = self.length
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
804 if todo >= 0:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
805 while todo > 0:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
806 data = self.fp.read(min(todo, self.bufsize))
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
807 if not data:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
808 self.done = -1
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
809 break
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
810 self.file.write(data)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
811 todo = todo - len(data)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
812
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
813 def read_lines(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
814 """Internal: read lines until EOF or outerboundary."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
815 self.file = self.make_file('')
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
816 if self.outerboundary:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
817 self.read_lines_to_outerboundary()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
818 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
819 self.read_lines_to_eof()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
820
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
821 def read_lines_to_eof(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
822 """Internal: read lines until EOF."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
823 while 1:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
824 line = self.fp.readline()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
825 if not line:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
826 self.done = -1
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
827 break
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
828 self.lines.append(line)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
829 if line[-2:] == '\r\n':
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
830 line = line[:-2] + '\n'
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
831 self.file.write(line)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
832
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
833 def read_lines_to_outerboundary(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
834 """Internal: read lines until outerboundary."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
835 next = "--" + self.outerboundary
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
836 last = next + "--"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
837 delim = ""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
838 while 1:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
839 line = self.fp.readline()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
840 if not line:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
841 self.done = -1
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
842 break
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
843 self.lines.append(line)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
844 if line[:2] == "--":
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
845 strippedline = string.strip(line)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
846 if strippedline == next:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
847 break
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
848 if strippedline == last:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
849 self.done = 1
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
850 break
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
851 if line[-2:] == "\r\n":
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
852 line = line[:-2]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
853 elif line[-1] == "\n":
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
854 line = line[:-1]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
855 self.file.write(delim + line)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
856 delim = "\n"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
857
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
858 def skip_lines(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
859 """Internal: skip lines until outer boundary if defined."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
860 if not self.outerboundary or self.done:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
861 return
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
862 next = "--" + self.outerboundary
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
863 last = next + "--"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
864 while 1:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
865 line = self.fp.readline()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
866 if not line:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
867 self.done = -1
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
868 break
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
869 self.lines.append(line)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
870 if line[:2] == "--":
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
871 strippedline = string.strip(line)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
872 if strippedline == next:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
873 break
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
874 if strippedline == last:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
875 self.done = 1
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
876 break
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
877
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
878 def make_file(self, binary):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
879 """Overridable: return a readable & writable file.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
880
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
881 The file will be used as follows:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
882 - data is written to it
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
883 - seek(0)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
884 - data is read from it
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
885
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
886 The 'binary' argument is 'b' if the file should be created in
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
887 binary mode (on non-Unix systems), '' otherwise.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
888
3447
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
889 This version opens a temporary file for reading and writing,
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
890 and immediately deletes (unlinks) it. The trick (on Unix!) is
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
891 that the file can still be used, but it can't be opened by
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
892 another process, and it will automatically be deleted when it
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
893 is closed or when the current process terminates.
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
894
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
895 If you want a more permanent file, you derive a class which
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
896 overrides this method. If you want a visible temporary file
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
897 that is nevertheless automatically deleted when the script
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
898 terminates, try defining a __del__ method in a derived class
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
899 which unlinks the temporary files you have created.
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
900
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
901 """
3447
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
902 import tempfile
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
903 tfn = tempfile.mktemp()
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
904 f = open(tfn, "w%s+" % binary)
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
905 os.unlink(tfn)
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
906 return f
3437
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
907
d70149202c93 Added FieldStorage class, which stores parts in files.
Guido van Rossum <guido@python.org>
parents: 3435
diff changeset
908
3447
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
909 # Backwards Compatibility Classes
db76fd390f74 Change to use real temporary files instead of StringIO. Correct and
Guido van Rossum <guido@python.org>
parents: 3446
diff changeset
910 # ===============================
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
911
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
912 class FormContentDict:
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
913 """Basic (multiple values per field) form content as dictionary.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
914
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
915 form = FormContentDict()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
916
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
917 form[key] -> [value, value, ...]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
918 form.has_key(key) -> Boolean
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
919 form.keys() -> [key, key, ...]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
920 form.values() -> [[val, val, ...], [val, val, ...], ...]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
921 form.items() -> [(key, [val, val, ...]), (key, [val, val, ...]), ...]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
922 form.dict == {key: [val, val, ...], ...}
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
923
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
924 """
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
925 def __init__( self ):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
926 self.dict = parse()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
927 self.query_string = environ['QUERY_STRING']
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
928 def __getitem__(self,key):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
929 return self.dict[key]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
930 def keys(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
931 return self.dict.keys()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
932 def has_key(self, key):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
933 return self.dict.has_key(key)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
934 def values(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
935 return self.dict.values()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
936 def items(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
937 return self.dict.items()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
938 def __len__( self ):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
939 return len(self.dict)
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
940
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
941
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
942 class SvFormContentDict(FormContentDict):
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
943 """Strict single-value expecting form content as dictionary.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
944
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
945 IF you only expect a single value for each field, then form[key]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
946 will return that single value. It will raise an IndexError if
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
947 that expectation is not true. IF you expect a field to have
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
948 possible multiple values, than you can use form.getlist(key) to
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
949 get all of the values. values() and items() are a compromise:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
950 they return single strings where there is a single value, and
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
951 lists of strings otherwise.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
952
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
953 """
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
954 def __getitem__(self, key):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
955 if len(self.dict[key]) > 1:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
956 raise IndexError, 'expecting a single value'
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
957 return self.dict[key][0]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
958 def getlist(self, key):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
959 return self.dict[key]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
960 def values(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
961 lis = []
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
962 for each in self.dict.values():
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
963 if len( each ) == 1 :
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
964 lis.append(each[0])
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
965 else: lis.append(each)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
966 return lis
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
967 def items(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
968 lis = []
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
969 for key,value in self.dict.items():
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
970 if len(value) == 1 :
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
971 lis.append((key, value[0]))
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
972 else: lis.append((key, value))
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
973 return lis
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
974
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
975
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
976 class InterpFormContentDict(SvFormContentDict):
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
977 """This class is present for backwards compatibility only."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
978 def __getitem__( self, key ):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
979 v = SvFormContentDict.__getitem__( self, key )
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
980 if v[0] in string.digits+'+-.' :
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
981 try: return string.atoi( v )
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
982 except ValueError:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
983 try: return string.atof( v )
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
984 except ValueError: pass
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
985 return string.strip(v)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
986 def values( self ):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
987 lis = []
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
988 for key in self.keys():
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
989 try:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
990 lis.append( self[key] )
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
991 except IndexError:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
992 lis.append( self.dict[key] )
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
993 return lis
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
994 def items( self ):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
995 lis = []
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
996 for key in self.keys():
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
997 try:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
998 lis.append( (key, self[key]) )
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
999 except IndexError:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1000 lis.append( (key, self.dict[key]) )
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1001 return lis
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1002
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1003
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1004 class FormContent(FormContentDict):
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1005 """This class is present for backwards compatibility only."""
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1006 def values(self, key):
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1007 if self.dict.has_key(key) :return self.dict[key]
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1008 else: return None
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1009 def indexed_value(self, key, location):
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1010 if self.dict.has_key(key):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1011 if len (self.dict[key]) > location:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1012 return self.dict[key][location]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1013 else: return None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1014 else: return None
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1015 def value(self, key):
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1016 if self.dict.has_key(key): return self.dict[key][0]
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1017 else: return None
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1018 def length(self, key):
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1019 return len(self.dict[key])
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1020 def stripped(self, key):
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1021 if self.dict.has_key(key): return string.strip(self.dict[key][0])
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1022 else: return None
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1023 def pars(self):
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1024 return self.dict
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1025
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1026
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1027 # Test/debug code
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1028 # ===============
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1029
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1030 def test():
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1031 """Robust test CGI script, usable as main program.
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1032
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1033 Write minimal HTTP headers and dump all information provided to
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1034 the script in HTML form.
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1035
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1036 """
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1037 import traceback
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1038 print "Content-type: text/html"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1039 print
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1040 sys.stderr = sys.stdout
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1041 try:
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1042 form = FieldStorage() # Replace with other classes to test those
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1043 print_form(form)
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1044 print_environ()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1045 print_directory()
3451
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
1046 print_arguments()
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1047 print_environ_usage()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1048 except:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1049 print "\n\n<PRE>" # Turn off HTML word wrap
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1050 traceback.print_exc()
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1051
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1052 def print_environ():
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1053 """Dump the shell environment as HTML."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1054 keys = environ.keys()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1055 keys.sort()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1056 print
3629
e54d39107249 capitalize H3 headers; add 'cgi.' prefix to example code
Guido van Rossum <guido@python.org>
parents: 3451
diff changeset
1057 print "<H3>Shell Environment:</H3>"
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1058 print "<DL>"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1059 for key in keys:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1060 print "<DT>", escape(key), "<DD>", escape(environ[key])
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1061 print "</DL>"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1062 print
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1063
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1064 def print_form(form):
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1065 """Dump the contents of a form as HTML."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1066 keys = form.keys()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1067 keys.sort()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1068 print
3629
e54d39107249 capitalize H3 headers; add 'cgi.' prefix to example code
Guido van Rossum <guido@python.org>
parents: 3451
diff changeset
1069 print "<H3>Form Contents:</H3>"
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1070 print "<DL>"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1071 for key in keys:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1072 print "<DT>" + escape(key) + ":",
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1073 value = form[key]
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1074 print "<i>" + escape(`type(value)`) + "</i>"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1075 print "<DD>" + escape(`value`)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1076 print "</DL>"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1077 print
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1078
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1079 def print_directory():
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1080 """Dump the current directory as HTML."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1081 print
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1082 print "<H3>Current Working Directory:</H3>"
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1083 try:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1084 pwd = os.getcwd()
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1085 except os.error, msg:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1086 print "os.error:", escape(str(msg))
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1087 else:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1088 print escape(pwd)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1089 print
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1090
3451
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
1091 def print_arguments():
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
1092 print
3629
e54d39107249 capitalize H3 headers; add 'cgi.' prefix to example code
Guido van Rossum <guido@python.org>
parents: 3451
diff changeset
1093 print "<H3>Command Line Arguments:</H3>"
3451
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
1094 print
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
1095 print sys.argv
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
1096 print
5abbc9b5fdf0 Added print_arguments() function.
Guido van Rossum <guido@python.org>
parents: 3447
diff changeset
1097
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1098 def print_environ_usage():
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1099 """Dump a list of environment variables used by CGI as HTML."""
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1100 print """
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1101 <H3>These environment variables could have been set:</H3>
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1102 <UL>
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1103 <LI>AUTH_TYPE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1104 <LI>CONTENT_LENGTH
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1105 <LI>CONTENT_TYPE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1106 <LI>DATE_GMT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1107 <LI>DATE_LOCAL
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1108 <LI>DOCUMENT_NAME
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1109 <LI>DOCUMENT_ROOT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1110 <LI>DOCUMENT_URI
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1111 <LI>GATEWAY_INTERFACE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1112 <LI>LAST_MODIFIED
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1113 <LI>PATH
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1114 <LI>PATH_INFO
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1115 <LI>PATH_TRANSLATED
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1116 <LI>QUERY_STRING
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1117 <LI>REMOTE_ADDR
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1118 <LI>REMOTE_HOST
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1119 <LI>REMOTE_IDENT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1120 <LI>REMOTE_USER
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1121 <LI>REQUEST_METHOD
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1122 <LI>SCRIPT_NAME
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1123 <LI>SERVER_NAME
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1124 <LI>SERVER_PORT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1125 <LI>SERVER_PROTOCOL
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1126 <LI>SERVER_ROOT
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1127 <LI>SERVER_SOFTWARE
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1128 </UL>
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1129 In addition, HTTP headers sent by the server may be passed in the
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1130 environment as well. Here are some common variable names:
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1131 <UL>
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1132 <LI>HTTP_ACCEPT
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1133 <LI>HTTP_CONNECTION
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1134 <LI>HTTP_HOST
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1135 <LI>HTTP_PRAGMA
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1136 <LI>HTTP_REFERER
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1137 <LI>HTTP_USER_AGENT
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1138 </UL>
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1139 """
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1140
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1141
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1142 # Utilities
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1143 # =========
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1144
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1145 def escape(s):
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1146 """Replace special characters '&', '<' and '>' by SGML entities."""
3446
623ba9bdeb22 Considerable documentation changes and a few import rearrangements.
Guido van Rossum <guido@python.org>
parents: 3444
diff changeset
1147 import regsub
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1148 s = regsub.gsub("&", "&amp;", s) # Must be done first!
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1149 s = regsub.gsub("<", "&lt;", s)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1150 s = regsub.gsub(">", "&gt;", s)
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1151 return s
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1152
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1153
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1154 # Invoke mainline
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1155 # ===============
2135
4f90b474beec new files
Guido van Rossum <guido@python.org>
parents:
diff changeset
1156
3432
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1157 # Call test() when this file is run as a script (not imported as a module)
6abc75ec6d29 File upload and revamped documentation.
Guido van Rossum <guido@python.org>
parents: 3106
diff changeset
1158 if __name__ == '__main__':
3444
e76ca34d48f3 Reformatted with 4-space indentation. Added some quick docs to the
Guido van Rossum <guido@python.org>
parents: 3437
diff changeset
1159 test()