libcgi.tex 23.6 KB
Newer Older
Fred Drake's avatar
Fred Drake committed
1 2
\section{\module{cgi} ---
         Common Gateway Interface support.}
3 4
\declaremodule{standard}{cgi}

Fred Drake's avatar
Fred Drake committed
5 6
\modulesynopsis{Common Gateway Interface support, used to interpret
forms in server-side scripts.}
7

Guido van Rossum's avatar
Guido van Rossum committed
8 9 10 11 12 13
\indexii{WWW}{server}
\indexii{CGI}{protocol}
\indexii{HTTP}{protocol}
\indexii{MIME}{headers}
\index{URL}

14

15
Support module for Common Gateway Interface (CGI) scripts.%
16
\index{Common Gateway Interface}
17 18 19 20 21

This module defines a number of utilities for use by CGI scripts
written in Python.

\subsection{Introduction}
22
\nodename{cgi-intro}
23 24

A CGI script is invoked by an HTTP server, usually to process user
25
input submitted through an HTML \code{<FORM>} or \code{<ISINDEX>} element.
26

27
Most often, CGI scripts live in the server's special \file{cgi-bin}
28 29 30 31 32 33 34
directory.  The HTTP server places all sorts of information about the
request (such as the client's hostname, the requested URL, the query
string, and lots of other goodies) in the script's shell environment,
executes the script, and sends the script's output back to the client.

The script's input is connected to the client too, and sometimes the
form data is read this way; at other times the form data is passed via
Fred Drake's avatar
Fred Drake committed
35
the ``query string'' part of the URL.  This module is intended
36 37 38
to take care of the different cases and provide a simpler interface to
the Python script.  It also provides a number of utilities that help
in debugging scripts, and the latest addition is support for file
Fred Drake's avatar
Fred Drake committed
39
uploads from a form (if your browser supports it --- Grail 0.3 and
40 41 42 43 44 45 46
Netscape 2.0 do).

The output of a CGI script should consist of two sections, separated
by a blank line.  The first section contains a number of headers,
telling the client what kind of data is following.  Python code to
generate a minimal header section looks like this:

47
\begin{verbatim}
48
print "Content-Type: text/html"     # HTML is following
Guido van Rossum's avatar
Guido van Rossum committed
49
print                               # blank line, end of headers
50
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
51

52 53 54
The second section is usually HTML, which allows the client software
to display nicely formatted text with header, in-line images, etc.
Here's Python code that prints a simple piece of HTML:
Guido van Rossum's avatar
Guido van Rossum committed
55

56
\begin{verbatim}
Guido van Rossum's avatar
Guido van Rossum committed
57 58 59
print "<TITLE>CGI script output</TITLE>"
print "<H1>This is my first CGI script</H1>"
print "Hello, world!"
60
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
61

62 63 64
\subsection{Using the cgi module}
\nodename{Using the cgi module}

Fred Drake's avatar
Fred Drake committed
65 66 67
Begin by writing \samp{import cgi}.  Do not use \samp{from cgi import
*} --- the module defines all sorts of names for its own use or for
backward compatibility that you don't want in your namespace.
68

69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
When you write a new script, consider adding the line:

\begin{verbatim}
import cgitb; cgitb.enable()
\end{verbatim}

This activates a special exception handler that will display detailed
reports in the Web browser if any errors occur.  If you'd rather not
show the guts of your program to users of your script, you can have
the reports saved to files instead, with a line like this:

\begin{verbatim}
import cgitb; cgitb.enable(display=0, logdir="/tmp")
\end{verbatim}

It's very helpful to use this feature during script development.
The reports produced by \refmodule{cgitb} provide information that
can save you a lot of time in tracking down bugs.  You can always
remove the \code{cgitb} line later when you have tested your script
and are confident that it works correctly.

To get at submitted form data,
it's best to use the \class{FieldStorage} class.  The other classes
Fred Drake's avatar
Fred Drake committed
92 93 94 95 96 97
defined in this module are provided mostly for backward compatibility.
Instantiate it exactly once, without arguments.  This reads the form
contents from standard input or the environment (depending on the
value of various environment variables set according to the CGI
standard).  Since it may consume standard input, it should be
instantiated only once.
98

99 100
The \class{FieldStorage} instance can be indexed like a Python
dictionary, and also supports the standard dictionary methods
101 102
\method{has_key()} and \method{keys()}.  The built-in \function{len()}
is also supported.  Form fields containing empty strings are ignored
103
and do not appear in the dictionary; to keep such values, provide
104 105
a true value for the the optional \var{keep_blank_values} keyword
parameter when creating the \class{FieldStorage} instance.
106 107

For instance, the following code (which assumes that the 
108 109 110
\mailheader{Content-Type} header and blank line have already been
printed) checks that the fields \code{name} and \code{addr} are both
set to a non-empty string:
111

112
\begin{verbatim}
Guido van Rossum's avatar
Guido van Rossum committed
113
form = cgi.FieldStorage()
114
if not (form.has_key("name") and form.has_key("addr")):
Guido van Rossum's avatar
Guido van Rossum committed
115 116 117
    print "<H1>Error</H1>"
    print "Please fill in the name and addr fields."
    return
118 119
print "<p>name:", form["name"].value
print "<p>addr:", form["addr"].value
Guido van Rossum's avatar
Guido van Rossum committed
120
...further form processing here...
121
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
122 123 124 125

Here the fields, accessed through \samp{form[\var{key}]}, are
themselves instances of \class{FieldStorage} (or
\class{MiniFieldStorage}, depending on the form encoding).
126
The \member{value} attribute of the instance yields the string value
127
of the field.  The \method{getvalue()} method returns this string value
128 129
directly; it also accepts an optional second argument as a default to
return if the requested key is not present.
130 131

If the submitted form data contains more than one field with the same
Fred Drake's avatar
Fred Drake committed
132 133
name, the object retrieved by \samp{form[\var{key}]} is not a
\class{FieldStorage} or \class{MiniFieldStorage}
134 135 136
instance but a list of such instances.  Similarly, in this situation,
\samp{form.getvalue(\var{key})} would return a list of strings.
If you expect this possibility
137
(when your HTML form contains multiple fields with the same name), use
138
the \function{isinstance()} built-in function to determine whether you
139 140
have a single instance or a list of instances.  For example, this
code concatenates any number of username fields, separated by
Fred Drake's avatar
Fred Drake committed
141
commas:
142

143
\begin{verbatim}
144
value = form.getvalue("username", "")
145
if isinstance(value, list):
Guido van Rossum's avatar
Guido van Rossum committed
146
    # Multiple username fields specified
147
    usernames = ",".join(value)
Guido van Rossum's avatar
Guido van Rossum committed
148
else:
149 150
    # Single or no username field specified
    usernames = value
151
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
152

153 154
If a field represents an uploaded file, accessing the value via the
\member{value} attribute or the \function{getvalue()} method reads the
Fred Drake's avatar
Fred Drake committed
155
entire file in memory as a string.  This may not be what you want.
156 157 158
You can test for an uploaded file by testing either the \member{filename}
attribute or the \member{file} attribute.  You can then read the data at
leisure from the \member{file} attribute:
159

160
\begin{verbatim}
Guido van Rossum's avatar
Guido van Rossum committed
161 162 163 164 165 166 167 168
fileitem = form["userfile"]
if fileitem.file:
    # It's an uploaded file; count lines
    linecount = 0
    while 1:
        line = fileitem.file.readline()
        if not line: break
        linecount = linecount + 1
169
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
170

171
The file upload draft standard entertains the possibility of uploading
Fred Drake's avatar
Fred Drake committed
172 173 174 175 176
multiple files from one field (using a recursive
\mimetype{multipart/*} encoding).  When this occurs, the item will be
a dictionary-like \class{FieldStorage} item.  This can be determined
by testing its \member{type} attribute, which should be
\mimetype{multipart/form-data} (or perhaps another MIME type matching
177
\mimetype{multipart/*}).  In this case, it can be iterated over
Fred Drake's avatar
Fred Drake committed
178
recursively just like the top-level form object.
179

Fred Drake's avatar
Fred Drake committed
180 181 182 183
When a form is submitted in the ``old'' format (as the query string or
as a single data part of type
\mimetype{application/x-www-form-urlencoded}), the items will actually
be instances of the class \class{MiniFieldStorage}.  In this case, the
184 185
\member{list}, \member{file}, and \member{filename} attributes are
always \code{None}.
186 187


188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
\subsection{Higher Level Interface}

\versionadded{2.2}  % XXX: Is this true ? 

The previous section explains how to read CGI form data using the
\class{FieldStorage} class.  This section describes a higher level
interface which was added to this class to allow one to do it in a
more readable and intuitive way.  The interface doesn't make the
techniques described in previous sections obsolete --- they are still
useful to process file uploads efficiently, for example.

The interface consists of two simple methods. Using the methods
you can process form data in a generic way, without the need to worry
whether only one or more values were posted under one name.

In the previous section, you learned to write following code anytime
you expected a user to post more than one value under one name:

\begin{verbatim}
item = form.getvalue("item")
208
if isinstance(item, list):
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252
    # The user is requesting more than one item.
else:
    # The user is requesting only one item.
\end{verbatim}

This situation is common for example when a form contains a group of
multiple checkboxes with the same name:

\begin{verbatim}
<input type="checkbox" name="item" value="1" />
<input type="checkbox" name="item" value="2" />
\end{verbatim}

In most situations, however, there's only one form control with a
particular name in a form and then you expect and need only one value
associated with this name.  So you write a script containing for
example this code:

\begin{verbatim}
user = form.getvalue("user").toupper()
\end{verbatim}

The problem with the code is that you should never expect that a
client will provide valid input to your scripts.  For example, if a
curious user appends another \samp{user=foo} pair to the query string,
then the script would crash, because in this situation the
\code{getvalue("user")} method call returns a list instead of a
string.  Calling the \method{toupper()} method on a list is not valid
(since lists do not have a method of this name) and results in an
\exception{AttributeError} exception.

Therefore, the appropriate way to read form data values was to always
use the code which checks whether the obtained value is a single value
or a list of values.  That's annoying and leads to less readable
scripts.

A more convenient approach is to use the methods \method{getfirst()}
and \method{getlist()} provided by this higher level interface.

\begin{methoddesc}[FieldStorage]{getfirst}{name\optional{, default}}
  Thin method always returns only one value associated with form field
  \var{name}.  The method returns only the first value in case that
  more values were posted under such name.  Please note that the order
  in which the values are received may vary from browser to browser
253 254 255 256 257 258 259 260
  and should not be counted on.\footnote{Note that some recent
      versions of the HTML specification do state what order the
      field values should be supplied in, but knowing whether a
      request was received from a conforming browser, or even from a
      browser at all, is tedious and error-prone.}  If no such form
  field or value exists then the method returns the value specified by
  the optional parameter \var{default}.  This parameter defaults to
  \code{None} if not specified.
261 262 263 264 265 266 267 268 269 270 271 272 273 274
\end{methoddesc}

\begin{methoddesc}[FieldStorage]{getlist}{name}
  This method always returns a list of values associated with form
  field \var{name}.  The method returns an empty list if no such form
  field or value exists for \var{name}.  It returns a list consisting
  of one item if only one such value exists.
\end{methoddesc}

Using these methods you can write nice compact code:

\begin{verbatim}
import cgi
form = cgi.FieldStorage()
275
user = form.getfirst("user", "").toupper()    # This way it's safe.
276 277 278 279 280
for item in form.getlist("item"):
    do_something(item)
\end{verbatim}


281 282
\subsection{Old classes}

Fred Drake's avatar
Fred Drake committed
283 284 285
These classes, present in earlier versions of the \module{cgi} module,
are still supported for backward compatibility.  New applications
should use the \class{FieldStorage} class.
286

Fred Drake's avatar
Fred Drake committed
287 288
\class{SvFormContentDict} stores single value form content as
dictionary; it assumes each field name occurs in the form only once.
289

Fred Drake's avatar
Fred Drake committed
290 291 292
\class{FormContentDict} stores multiple value form content as a
dictionary (the form items are lists of values).  Useful if your form
contains multiple fields with the same name.
293

Fred Drake's avatar
Fred Drake committed
294 295 296 297
Other classes (\class{FormContent}, \class{InterpFormContentDict}) are
present for backwards compatibility with really old applications only.
If you still use these and would be inconvenienced when they
disappeared from a next version of this module, drop me a note.
298 299 300


\subsection{Functions}
301
\nodename{Functions in cgi module}
302 303 304 305 306

These are useful if you want more control, or if you want to employ
some of the algorithms implemented in this module in other
circumstances.

307 308 309 310 311 312
\begin{funcdesc}{parse}{fp\optional{, keep_blank_values\optional{,
                        strict_parsing}}}
  Parse a query in the environment or from a file (the file defaults
  to \code{sys.stdin}).  The \var{keep_blank_values} and
  \var{strict_parsing} parameters are passed to \function{parse_qs()}
  unchanged.
Guido van Rossum's avatar
Guido van Rossum committed
313 314
\end{funcdesc}

315 316
\begin{funcdesc}{parse_qs}{qs\optional{, keep_blank_values\optional{,
                           strict_parsing}}}
Fred Drake's avatar
Fred Drake committed
317
Parse a query string given as a string argument (data of type 
318 319
\mimetype{application/x-www-form-urlencoded}).  Data are
returned as a dictionary.  The dictionary keys are the unique query
320
variable names and the values are lists of values for each name.
321 322 323 324 325 326 327 328 329 330 331 332 333 334 335

The optional argument \var{keep_blank_values} is
a flag indicating whether blank values in
URL encoded queries should be treated as blank strings.  
A true value indicates that blanks should be retained as 
blank strings.  The default false value indicates that
blank values are to be ignored and treated as if they were
not included.

The optional argument \var{strict_parsing} is a flag indicating what
to do with parsing errors.  If false (the default), errors
are silently ignored.  If true, errors raise a ValueError
exception.
\end{funcdesc}

336 337
\begin{funcdesc}{parse_qsl}{qs\optional{, keep_blank_values\optional{,
                            strict_parsing}}}
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
Parse a query string given as a string argument (data of type 
\mimetype{application/x-www-form-urlencoded}).  Data are
returned as a list of name, value pairs.

The optional argument \var{keep_blank_values} is
a flag indicating whether blank values in
URL encoded queries should be treated as blank strings.  
A true value indicates that blanks should be retained as 
blank strings.  The default false value indicates that
blank values are to be ignored and treated as if they were
not included.

The optional argument \var{strict_parsing} is a flag indicating what
to do with parsing errors.  If false (the default), errors
are silently ignored.  If true, errors raise a ValueError
exception.
Guido van Rossum's avatar
Guido van Rossum committed
354 355
\end{funcdesc}

356
\begin{funcdesc}{parse_multipart}{fp, pdict}
Fred Drake's avatar
Fred Drake committed
357 358
Parse input of type \mimetype{multipart/form-data} (for 
file uploads).  Arguments are \var{fp} for the input file and
359
\var{pdict} for a dictionary containing other parameters in
360
the \mailheader{Content-Type} header.
Fred Drake's avatar
Fred Drake committed
361 362 363 364 365

Returns a dictionary just like \function{parse_qs()} keys are the
field names, each value is a list of values for that field.  This is
easy to use but not much good if you are expecting megabytes to be
uploaded --- in that case, use the \class{FieldStorage} class instead
366
which is much more flexible.
Fred Drake's avatar
Fred Drake committed
367 368 369

Note that this does not parse nested multipart parts --- use
\class{FieldStorage} for that.
Guido van Rossum's avatar
Guido van Rossum committed
370 371
\end{funcdesc}

372
\begin{funcdesc}{parse_header}{string}
373
Parse a MIME header (such as \mailheader{Content-Type}) into a main
374
value and a dictionary of parameters.
Guido van Rossum's avatar
Guido van Rossum committed
375 376
\end{funcdesc}

377
\begin{funcdesc}{test}{}
Fred Drake's avatar
Fred Drake committed
378 379 380
Robust test CGI script, usable as main program.
Writes minimal HTTP headers and formats all information provided to
the script in HTML form.
Guido van Rossum's avatar
Guido van Rossum committed
381 382
\end{funcdesc}

383
\begin{funcdesc}{print_environ}{}
Fred Drake's avatar
Fred Drake committed
384
Format the shell environment in HTML.
385
\end{funcdesc}
Guido van Rossum's avatar
Guido van Rossum committed
386

387
\begin{funcdesc}{print_form}{form}
Fred Drake's avatar
Fred Drake committed
388
Format a form in HTML.
Guido van Rossum's avatar
Guido van Rossum committed
389 390
\end{funcdesc}

391
\begin{funcdesc}{print_directory}{}
Fred Drake's avatar
Fred Drake committed
392
Format the current directory in HTML.
Guido van Rossum's avatar
Guido van Rossum committed
393 394
\end{funcdesc}

395
\begin{funcdesc}{print_environ_usage}{}
Fred Drake's avatar
Fred Drake committed
396
Print a list of useful (used by CGI) environment variables in
397 398 399
HTML.
\end{funcdesc}

400
\begin{funcdesc}{escape}{s\optional{, quote}}
Fred Drake's avatar
Fred Drake committed
401 402 403 404
Convert the characters
\character{\&}, \character{<} and \character{>} in string \var{s} to
HTML-safe sequences.  Use this if you need to display text that might
contain such characters in HTML.  If the optional flag \var{quote} is
405
true, the double-quote character (\character{"}) is also translated;
406
this helps for inclusion in an HTML attribute value, as in \code{<A
407
HREF="...">}.  If the value to be quoted might include single- or
408 409 410
double-quote characters, or both, consider using the
\function{quoteattr()} function in the \refmodule{xml.sax.saxutils}
module instead.
411 412 413
\end{funcdesc}


414 415 416
\subsection{Caring about security \label{cgi-security}}

\indexii{CGI}{security}
Guido van Rossum's avatar
Guido van Rossum committed
417

418 419 420 421
There's one important rule: if you invoke an external program (via the
\function{os.system()} or \function{os.popen()} functions. or others
with similar functionality), make very sure you don't pass arbitrary
strings received from the client to the shell.  This is a well-known
422
security hole whereby clever hackers anywhere on the Web can exploit a
423 424 425
gullible CGI script to invoke arbitrary shell commands.  Even parts of
the URL or field names cannot be trusted, since the request doesn't
have to come from your form!
Guido van Rossum's avatar
Guido van Rossum committed
426

427 428 429
To be on the safe side, if you must pass a string gotten from a form
to a shell command, you should make sure the string contains only
alphanumeric characters, dashes, underscores, and periods.
430 431


432
\subsection{Installing your CGI script on a \UNIX\ system}
433

434 435
Read the documentation for your HTTP server and check with your local
system administrator to find the directory where CGI scripts should be
436
installed; usually this is in a directory \file{cgi-bin} in the server tree.
437 438

Make sure that your script is readable and executable by ``others''; the
Fred Drake's avatar
Fred Drake committed
439
\UNIX{} file mode should be \code{0755} octal (use \samp{chmod 0755
440
\var{filename}}).  Make sure that the first line of the script contains
Fred Drake's avatar
Fred Drake committed
441 442
\code{\#!} starting in column 1 followed by the pathname of the Python
interpreter, for instance:
443

444
\begin{verbatim}
Guido van Rossum's avatar
Guido van Rossum committed
445
#!/usr/local/bin/python
446
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
447

448 449 450
Make sure the Python interpreter exists and is executable by ``others''.

Make sure that any files your script needs to read or write are
Fred Drake's avatar
Fred Drake committed
451 452 453 454 455 456 457
readable or writable, respectively, by ``others'' --- their mode
should be \code{0644} for readable and \code{0666} for writable.  This
is because, for security reasons, the HTTP server executes your script
as user ``nobody'', without any special privileges.  It can only read
(write, execute) files that everybody can read (write, execute).  The
current directory at execution time is also different (it is usually
the server's cgi-bin directory) and the set of environment variables
458
is also different from what you get when you log in.  In particular, don't
Fred Drake's avatar
Fred Drake committed
459 460 461
count on the shell's search path for executables (\envvar{PATH}) or
the Python module search path (\envvar{PYTHONPATH}) to be set to
anything interesting.
462 463 464

If you need to load modules from a directory which is not on Python's
default module search path, you can change the path in your script,
465
before importing other modules.  For example:
466

467
\begin{verbatim}
Guido van Rossum's avatar
Guido van Rossum committed
468 469 470
import sys
sys.path.insert(0, "/usr/home/joe/lib/python")
sys.path.insert(0, "/usr/local/lib/python")
471
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
472

473 474
(This way, the directory inserted last will be searched first!)

Fred Drake's avatar
Fred Drake committed
475
Instructions for non-\UNIX{} systems will vary; check your HTTP server's
476 477
documentation (it will usually have a section on CGI scripts).

478

479 480 481 482 483 484
\subsection{Testing your CGI script}

Unfortunately, a CGI script will generally not run when you try it
from the command line, and a script that works perfectly from the
command line may fail mysteriously when run from the server.  There's
one reason why you should still test your script from the command
485
line: if it contains a syntax error, the Python interpreter won't
486 487 488 489
execute it at all, and the HTTP server will most likely send a cryptic
error to the client.

Assuming your script has no syntax errors, yet it does not work, you
Fred Drake's avatar
Fred Drake committed
490
have no choice but to read the next section.
491 492


493
\subsection{Debugging CGI scripts} \indexii{CGI}{debugging}
494

Fred Drake's avatar
Fred Drake committed
495
First of all, check for trivial installation errors --- reading the
496 497 498
section above on installing your CGI script carefully can save you a
lot of time.  If you wonder whether you have understood the
installation procedure correctly, try installing a copy of this module
499
file (\file{cgi.py}) as a CGI script.  When invoked as a script, the file
500 501
will dump its environment and the contents of the form in HTML form.
Give it the right mode etc, and send it a request.  If it's installed
502
in the standard \file{cgi-bin} directory, it should be possible to send it a
503
request by entering a URL into your browser of the form:
504

505
\begin{verbatim}
Guido van Rossum's avatar
Guido van Rossum committed
506
http://yourhostname/cgi-bin/cgi.py?name=Joe+Blow&addr=At+Home
507
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
508

509 510
If this gives an error of type 404, the server cannot find the script
-- perhaps you need to install it in a different directory.  If it
511
gives another error, there's an installation problem that
512 513 514
you should fix before trying to go any further.  If you get a nicely
formatted listing of the environment and form content (in this
example, the fields should be listed as ``addr'' with value ``At Home''
515
and ``name'' with value ``Joe Blow''), the \file{cgi.py} script has been
516 517
installed correctly.  If you follow the same procedure for your own
script, you should now be able to debug it.
518

Fred Drake's avatar
Fred Drake committed
519 520 521
The next step could be to call the \module{cgi} module's
\function{test()} function from your script: replace its main code
with the single statement
522

523
\begin{verbatim}
Guido van Rossum's avatar
Guido van Rossum committed
524
cgi.test()
525
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
526

527
This should produce the same results as those gotten from installing
528
the \file{cgi.py} file itself.
529

530 531 532 533 534
When an ordinary Python script raises an unhandled exception (for
whatever reason: of a typo in a module name, a file that can't be
opened, etc.), the Python interpreter prints a nice traceback and
exits.  While the Python interpreter will still do this when your CGI
script raises an exception, most likely the traceback will end up in
535
one of the HTTP server's log files, or be discarded altogether.
536 537

Fortunately, once you have managed to get your script to execute
538 539 540
\emph{some} code, you can easily send tracebacks to the Web browser
using the \refmodule{cgitb} module.  If you haven't done so already,
just add the line:
541

542
\begin{verbatim}
543
import cgitb; cgitb.enable()
544
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
545

546 547 548
to the top of your script.  Then try running it again; when a
problem occurs, you should see a detailed report that will
likely make apparent the cause of the crash.
549

550 551 552
If you suspect that there may be a problem in importing the
\refmodule{cgitb} module, you can use an even more robust approach
(which only uses built-in modules):
553

554
\begin{verbatim}
Guido van Rossum's avatar
Guido van Rossum committed
555 556
import sys
sys.stderr = sys.stdout
557
print "Content-Type: text/plain"
Guido van Rossum's avatar
Guido van Rossum committed
558 559
print
...your code here...
560
\end{verbatim}
Fred Drake's avatar
Fred Drake committed
561

562 563 564 565 566
This relies on the Python interpreter to print the traceback.  The
content type of the output is set to plain text, which disables all
HTML processing.  If your script works, the raw HTML will be displayed
by your client.  If it raises an exception, most likely after the
first two lines have been printed, a traceback will be displayed.
567
Because no HTML interpretation is going on, the traceback will be
568
readable.
569 570


571
\subsection{Common problems and solutions}
572 573

\begin{itemize}
574 575 576 577 578 579
\item Most HTTP servers buffer the output from CGI scripts until the
script is completed.  This means that it is not possible to display a
progress report on the client's display while the script is running.

\item Check the installation instructions above.

Fred Drake's avatar
Fred Drake committed
580 581
\item Check the HTTP server's log files.  (\samp{tail -f logfile} in a
separate window may be useful!)
582 583

\item Always check a script for syntax errors first, by doing something
Fred Drake's avatar
Fred Drake committed
584
like \samp{python script.py}.
585

586 587
\item If your script does not have any syntax errors, try adding
\samp{import cgitb; cgitb.enable()} to the top of the script.
588 589

\item When invoking external programs, make sure they can be found.
Fred Drake's avatar
Fred Drake committed
590 591
Usually, this means using absolute path names --- \envvar{PATH} is
usually not set to a very useful value in a CGI script.
592 593 594 595 596 597

\item When reading or writing external files, make sure they can be read
or written by every user on the system.

\item Don't try to give a CGI script a set-uid mode.  This doesn't work on
most systems, and is a security liability as well.
598 599
\end{itemize}