Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 1 | |
| 2 | :mod:`cgi` --- Common Gateway Interface support. |
| 3 | ================================================ |
| 4 | |
| 5 | .. module:: cgi |
| 6 | :synopsis: Helpers for running Python scripts via the Common Gateway Interface. |
| 7 | |
| 8 | |
| 9 | .. index:: |
| 10 | pair: WWW; server |
| 11 | pair: CGI; protocol |
| 12 | pair: HTTP; protocol |
| 13 | pair: MIME; headers |
| 14 | single: URL |
| 15 | single: Common Gateway Interface |
| 16 | |
| 17 | Support module for Common Gateway Interface (CGI) scripts. |
| 18 | |
| 19 | This module defines a number of utilities for use by CGI scripts written in |
| 20 | Python. |
| 21 | |
| 22 | |
| 23 | Introduction |
| 24 | ------------ |
| 25 | |
| 26 | .. _cgi-intro: |
| 27 | |
| 28 | A CGI script is invoked by an HTTP server, usually to process user input |
| 29 | submitted through an HTML ``<FORM>`` or ``<ISINDEX>`` element. |
| 30 | |
| 31 | Most often, CGI scripts live in the server's special :file:`cgi-bin` directory. |
| 32 | The HTTP server places all sorts of information about the request (such as the |
| 33 | client's hostname, the requested URL, the query string, and lots of other |
| 34 | goodies) in the script's shell environment, executes the script, and sends the |
| 35 | script's output back to the client. |
| 36 | |
| 37 | The script's input is connected to the client too, and sometimes the form data |
| 38 | is read this way; at other times the form data is passed via the "query string" |
| 39 | part of the URL. This module is intended to take care of the different cases |
| 40 | and provide a simpler interface to the Python script. It also provides a number |
| 41 | of utilities that help in debugging scripts, and the latest addition is support |
| 42 | for file uploads from a form (if your browser supports it). |
| 43 | |
| 44 | The output of a CGI script should consist of two sections, separated by a blank |
| 45 | line. The first section contains a number of headers, telling the client what |
| 46 | kind of data is following. Python code to generate a minimal header section |
| 47 | looks like this:: |
| 48 | |
Georg Brandl | 6911e3c | 2007-09-04 07:15:32 +0000 | [diff] [blame] | 49 | print("Content-Type: text/html") # HTML is following |
| 50 | print() # blank line, end of headers |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 51 | |
| 52 | The second section is usually HTML, which allows the client software to display |
| 53 | nicely formatted text with header, in-line images, etc. Here's Python code that |
| 54 | prints a simple piece of HTML:: |
| 55 | |
Georg Brandl | 6911e3c | 2007-09-04 07:15:32 +0000 | [diff] [blame] | 56 | print("<TITLE>CGI script output</TITLE>") |
| 57 | print("<H1>This is my first CGI script</H1>") |
| 58 | print("Hello, world!") |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 59 | |
| 60 | |
| 61 | .. _using-the-cgi-module: |
| 62 | |
| 63 | Using the cgi module |
| 64 | -------------------- |
| 65 | |
Georg Brandl | 49d1b4f | 2008-05-11 21:42:51 +0000 | [diff] [blame^] | 66 | Begin by writing ``import cgi``. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 67 | |
| 68 | When you write a new script, consider adding the line:: |
| 69 | |
| 70 | import cgitb; cgitb.enable() |
| 71 | |
| 72 | This activates a special exception handler that will display detailed reports in |
| 73 | the Web browser if any errors occur. If you'd rather not show the guts of your |
| 74 | program to users of your script, you can have the reports saved to files |
| 75 | instead, with a line like this:: |
| 76 | |
| 77 | import cgitb; cgitb.enable(display=0, logdir="/tmp") |
| 78 | |
| 79 | It's very helpful to use this feature during script development. The reports |
| 80 | produced by :mod:`cgitb` provide information that can save you a lot of time in |
| 81 | tracking down bugs. You can always remove the ``cgitb`` line later when you |
| 82 | have tested your script and are confident that it works correctly. |
| 83 | |
Georg Brandl | 49d1b4f | 2008-05-11 21:42:51 +0000 | [diff] [blame^] | 84 | To get at submitted form data, use the :class:`FieldStorage` class. Instantiate |
| 85 | it exactly once, without arguments. This reads the form contents from standard |
| 86 | input or the environment (depending on the value of various environment |
| 87 | variables set according to the CGI standard). Since it may consume standard |
| 88 | input, it should be instantiated only once. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 89 | |
| 90 | The :class:`FieldStorage` instance can be indexed like a Python dictionary, and |
Collin Winter | c79461b | 2007-09-01 23:34:30 +0000 | [diff] [blame] | 91 | also supports the standard dictionary methods :meth:`__contains__` and |
| 92 | :meth:`keys`. The built-in :func:`len` is also supported. Form fields |
| 93 | containing empty strings are ignored and do not appear in the dictionary; to |
| 94 | keep such values, provide a true value for the optional *keep_blank_values* |
| 95 | keyword parameter when creating the :class:`FieldStorage` instance. |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 96 | |
| 97 | For instance, the following code (which assumes that the |
| 98 | :mailheader:`Content-Type` header and blank line have already been printed) |
| 99 | checks that the fields ``name`` and ``addr`` are both set to a non-empty |
| 100 | string:: |
| 101 | |
| 102 | form = cgi.FieldStorage() |
Collin Winter | c79461b | 2007-09-01 23:34:30 +0000 | [diff] [blame] | 103 | if not ("name" in form and "addr" in form): |
Georg Brandl | 6911e3c | 2007-09-04 07:15:32 +0000 | [diff] [blame] | 104 | print("<H1>Error</H1>") |
| 105 | print("Please fill in the name and addr fields.") |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 106 | return |
Georg Brandl | 6911e3c | 2007-09-04 07:15:32 +0000 | [diff] [blame] | 107 | print("<p>name:", form["name"].value) |
| 108 | print("<p>addr:", form["addr"].value) |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 109 | ...further form processing here... |
| 110 | |
| 111 | Here the fields, accessed through ``form[key]``, are themselves instances of |
| 112 | :class:`FieldStorage` (or :class:`MiniFieldStorage`, depending on the form |
| 113 | encoding). The :attr:`value` attribute of the instance yields the string value |
| 114 | of the field. The :meth:`getvalue` method returns this string value directly; |
| 115 | it also accepts an optional second argument as a default to return if the |
| 116 | requested key is not present. |
| 117 | |
| 118 | If the submitted form data contains more than one field with the same name, the |
| 119 | object retrieved by ``form[key]`` is not a :class:`FieldStorage` or |
| 120 | :class:`MiniFieldStorage` instance but a list of such instances. Similarly, in |
| 121 | this situation, ``form.getvalue(key)`` would return a list of strings. If you |
| 122 | expect this possibility (when your HTML form contains multiple fields with the |
| 123 | same name), use the :func:`getlist` function, which always returns a list of |
| 124 | values (so that you do not need to special-case the single item case). For |
| 125 | example, this code concatenates any number of username fields, separated by |
| 126 | commas:: |
| 127 | |
| 128 | value = form.getlist("username") |
| 129 | usernames = ",".join(value) |
| 130 | |
| 131 | If a field represents an uploaded file, accessing the value via the |
| 132 | :attr:`value` attribute or the :func:`getvalue` method reads the entire file in |
| 133 | memory as a string. This may not be what you want. You can test for an uploaded |
| 134 | file by testing either the :attr:`filename` attribute or the :attr:`file` |
| 135 | attribute. You can then read the data at leisure from the :attr:`file` |
| 136 | attribute:: |
| 137 | |
| 138 | fileitem = form["userfile"] |
| 139 | if fileitem.file: |
| 140 | # It's an uploaded file; count lines |
| 141 | linecount = 0 |
Collin Winter | 4633448 | 2007-09-10 00:49:57 +0000 | [diff] [blame] | 142 | while True: |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 143 | line = fileitem.file.readline() |
| 144 | if not line: break |
| 145 | linecount = linecount + 1 |
| 146 | |
Sean Reifscheider | 782d6b4 | 2007-09-18 23:39:35 +0000 | [diff] [blame] | 147 | If an error is encountered when obtaining the contents of an uploaded file |
| 148 | (for example, when the user interrupts the form submission by clicking on |
| 149 | a Back or Cancel button) the :attr:`done` attribute of the object for the |
| 150 | field will be set to the value -1. |
| 151 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 152 | The file upload draft standard entertains the possibility of uploading multiple |
| 153 | files from one field (using a recursive :mimetype:`multipart/\*` encoding). |
| 154 | When this occurs, the item will be a dictionary-like :class:`FieldStorage` item. |
| 155 | This can be determined by testing its :attr:`type` attribute, which should be |
| 156 | :mimetype:`multipart/form-data` (or perhaps another MIME type matching |
| 157 | :mimetype:`multipart/\*`). In this case, it can be iterated over recursively |
| 158 | just like the top-level form object. |
| 159 | |
| 160 | When a form is submitted in the "old" format (as the query string or as a single |
| 161 | data part of type :mimetype:`application/x-www-form-urlencoded`), the items will |
| 162 | actually be instances of the class :class:`MiniFieldStorage`. In this case, the |
| 163 | :attr:`list`, :attr:`file`, and :attr:`filename` attributes are always ``None``. |
| 164 | |
| 165 | |
| 166 | Higher Level Interface |
| 167 | ---------------------- |
| 168 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 169 | The previous section explains how to read CGI form data using the |
| 170 | :class:`FieldStorage` class. This section describes a higher level interface |
| 171 | which was added to this class to allow one to do it in a more readable and |
| 172 | intuitive way. The interface doesn't make the techniques described in previous |
| 173 | sections obsolete --- they are still useful to process file uploads efficiently, |
| 174 | for example. |
| 175 | |
Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 176 | .. XXX: Is this true ? |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 177 | |
| 178 | The interface consists of two simple methods. Using the methods you can process |
| 179 | form data in a generic way, without the need to worry whether only one or more |
| 180 | values were posted under one name. |
| 181 | |
| 182 | In the previous section, you learned to write following code anytime you |
| 183 | expected a user to post more than one value under one name:: |
| 184 | |
| 185 | item = form.getvalue("item") |
| 186 | if isinstance(item, list): |
| 187 | # The user is requesting more than one item. |
| 188 | else: |
| 189 | # The user is requesting only one item. |
| 190 | |
| 191 | This situation is common for example when a form contains a group of multiple |
| 192 | checkboxes with the same name:: |
| 193 | |
| 194 | <input type="checkbox" name="item" value="1" /> |
| 195 | <input type="checkbox" name="item" value="2" /> |
| 196 | |
| 197 | In most situations, however, there's only one form control with a particular |
| 198 | name in a form and then you expect and need only one value associated with this |
| 199 | name. So you write a script containing for example this code:: |
| 200 | |
| 201 | user = form.getvalue("user").upper() |
| 202 | |
| 203 | The problem with the code is that you should never expect that a client will |
| 204 | provide valid input to your scripts. For example, if a curious user appends |
| 205 | another ``user=foo`` pair to the query string, then the script would crash, |
| 206 | because in this situation the ``getvalue("user")`` method call returns a list |
| 207 | instead of a string. Calling the :meth:`toupper` method on a list is not valid |
| 208 | (since lists do not have a method of this name) and results in an |
| 209 | :exc:`AttributeError` exception. |
| 210 | |
| 211 | Therefore, the appropriate way to read form data values was to always use the |
| 212 | code which checks whether the obtained value is a single value or a list of |
| 213 | values. That's annoying and leads to less readable scripts. |
| 214 | |
| 215 | A more convenient approach is to use the methods :meth:`getfirst` and |
| 216 | :meth:`getlist` provided by this higher level interface. |
| 217 | |
| 218 | |
| 219 | .. method:: FieldStorage.getfirst(name[, default]) |
| 220 | |
| 221 | This method always returns only one value associated with form field *name*. |
| 222 | The method returns only the first value in case that more values were posted |
| 223 | under such name. Please note that the order in which the values are received |
| 224 | may vary from browser to browser and should not be counted on. [#]_ If no such |
| 225 | form field or value exists then the method returns the value specified by the |
| 226 | optional parameter *default*. This parameter defaults to ``None`` if not |
| 227 | specified. |
| 228 | |
| 229 | |
| 230 | .. method:: FieldStorage.getlist(name) |
| 231 | |
| 232 | This method always returns a list of values associated with form field *name*. |
| 233 | The method returns an empty list if no such form field or value exists for |
| 234 | *name*. It returns a list consisting of one item if only one such value exists. |
| 235 | |
| 236 | Using these methods you can write nice compact code:: |
| 237 | |
| 238 | import cgi |
| 239 | form = cgi.FieldStorage() |
| 240 | user = form.getfirst("user", "").upper() # This way it's safe. |
| 241 | for item in form.getlist("item"): |
| 242 | do_something(item) |
| 243 | |
| 244 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 245 | .. _functions-in-cgi-module: |
| 246 | |
| 247 | Functions |
| 248 | --------- |
| 249 | |
| 250 | These are useful if you want more control, or if you want to employ some of the |
| 251 | algorithms implemented in this module in other circumstances. |
| 252 | |
| 253 | |
| 254 | .. function:: parse(fp[, keep_blank_values[, strict_parsing]]) |
| 255 | |
| 256 | Parse a query in the environment or from a file (the file defaults to |
| 257 | ``sys.stdin``). The *keep_blank_values* and *strict_parsing* parameters are |
| 258 | passed to :func:`parse_qs` unchanged. |
| 259 | |
| 260 | |
| 261 | .. function:: parse_qs(qs[, keep_blank_values[, strict_parsing]]) |
| 262 | |
| 263 | Parse a query string given as a string argument (data of type |
| 264 | :mimetype:`application/x-www-form-urlencoded`). Data are returned as a |
| 265 | dictionary. The dictionary keys are the unique query variable names and the |
| 266 | values are lists of values for each name. |
| 267 | |
| 268 | The optional argument *keep_blank_values* is a flag indicating whether blank |
| 269 | values in URL encoded queries should be treated as blank strings. A true value |
| 270 | indicates that blanks should be retained as blank strings. The default false |
| 271 | value indicates that blank values are to be ignored and treated as if they were |
| 272 | not included. |
| 273 | |
| 274 | The optional argument *strict_parsing* is a flag indicating what to do with |
| 275 | parsing errors. If false (the default), errors are silently ignored. If true, |
| 276 | errors raise a :exc:`ValueError` exception. |
| 277 | |
| 278 | Use the :func:`urllib.urlencode` function to convert such dictionaries into |
| 279 | query strings. |
| 280 | |
| 281 | |
| 282 | .. function:: parse_qsl(qs[, keep_blank_values[, strict_parsing]]) |
| 283 | |
| 284 | Parse a query string given as a string argument (data of type |
| 285 | :mimetype:`application/x-www-form-urlencoded`). Data are returned as a list of |
| 286 | name, value pairs. |
| 287 | |
| 288 | The optional argument *keep_blank_values* is a flag indicating whether blank |
| 289 | values in URL encoded queries should be treated as blank strings. A true value |
| 290 | indicates that blanks should be retained as blank strings. The default false |
| 291 | value indicates that blank values are to be ignored and treated as if they were |
| 292 | not included. |
| 293 | |
| 294 | The optional argument *strict_parsing* is a flag indicating what to do with |
| 295 | parsing errors. If false (the default), errors are silently ignored. If true, |
| 296 | errors raise a :exc:`ValueError` exception. |
| 297 | |
| 298 | Use the :func:`urllib.urlencode` function to convert such lists of pairs into |
| 299 | query strings. |
| 300 | |
| 301 | |
| 302 | .. function:: parse_multipart(fp, pdict) |
| 303 | |
| 304 | Parse input of type :mimetype:`multipart/form-data` (for file uploads). |
| 305 | Arguments are *fp* for the input file and *pdict* for a dictionary containing |
| 306 | other parameters in the :mailheader:`Content-Type` header. |
| 307 | |
| 308 | Returns a dictionary just like :func:`parse_qs` keys are the field names, each |
| 309 | value is a list of values for that field. This is easy to use but not much good |
| 310 | if you are expecting megabytes to be uploaded --- in that case, use the |
| 311 | :class:`FieldStorage` class instead which is much more flexible. |
| 312 | |
| 313 | Note that this does not parse nested multipart parts --- use |
| 314 | :class:`FieldStorage` for that. |
| 315 | |
| 316 | |
| 317 | .. function:: parse_header(string) |
| 318 | |
| 319 | Parse a MIME header (such as :mailheader:`Content-Type`) into a main value and a |
| 320 | dictionary of parameters. |
| 321 | |
| 322 | |
| 323 | .. function:: test() |
| 324 | |
| 325 | Robust test CGI script, usable as main program. Writes minimal HTTP headers and |
| 326 | formats all information provided to the script in HTML form. |
| 327 | |
| 328 | |
| 329 | .. function:: print_environ() |
| 330 | |
| 331 | Format the shell environment in HTML. |
| 332 | |
| 333 | |
| 334 | .. function:: print_form(form) |
| 335 | |
| 336 | Format a form in HTML. |
| 337 | |
| 338 | |
| 339 | .. function:: print_directory() |
| 340 | |
| 341 | Format the current directory in HTML. |
| 342 | |
| 343 | |
| 344 | .. function:: print_environ_usage() |
| 345 | |
| 346 | Print a list of useful (used by CGI) environment variables in HTML. |
| 347 | |
| 348 | |
| 349 | .. function:: escape(s[, quote]) |
| 350 | |
| 351 | Convert the characters ``'&'``, ``'<'`` and ``'>'`` in string *s* to HTML-safe |
| 352 | sequences. Use this if you need to display text that might contain such |
| 353 | characters in HTML. If the optional flag *quote* is true, the quotation mark |
| 354 | character (``'"'``) is also translated; this helps for inclusion in an HTML |
| 355 | attribute value, as in ``<A HREF="...">``. If the value to be quoted might |
| 356 | include single- or double-quote characters, or both, consider using the |
| 357 | :func:`quoteattr` function in the :mod:`xml.sax.saxutils` module instead. |
| 358 | |
| 359 | |
| 360 | .. _cgi-security: |
| 361 | |
| 362 | Caring about security |
| 363 | --------------------- |
| 364 | |
| 365 | .. index:: pair: CGI; security |
| 366 | |
| 367 | There's one important rule: if you invoke an external program (via the |
| 368 | :func:`os.system` or :func:`os.popen` functions. or others with similar |
| 369 | functionality), make very sure you don't pass arbitrary strings received from |
| 370 | the client to the shell. This is a well-known security hole whereby clever |
| 371 | hackers anywhere on the Web can exploit a gullible CGI script to invoke |
| 372 | arbitrary shell commands. Even parts of the URL or field names cannot be |
| 373 | trusted, since the request doesn't have to come from your form! |
| 374 | |
| 375 | To be on the safe side, if you must pass a string gotten from a form to a shell |
| 376 | command, you should make sure the string contains only alphanumeric characters, |
| 377 | dashes, underscores, and periods. |
| 378 | |
| 379 | |
| 380 | Installing your CGI script on a Unix system |
| 381 | ------------------------------------------- |
| 382 | |
| 383 | Read the documentation for your HTTP server and check with your local system |
| 384 | administrator to find the directory where CGI scripts should be installed; |
| 385 | usually this is in a directory :file:`cgi-bin` in the server tree. |
| 386 | |
| 387 | Make sure that your script is readable and executable by "others"; the Unix file |
| 388 | mode should be ``0755`` octal (use ``chmod 0755 filename``). Make sure that the |
| 389 | first line of the script contains ``#!`` starting in column 1 followed by the |
| 390 | pathname of the Python interpreter, for instance:: |
| 391 | |
| 392 | #!/usr/local/bin/python |
| 393 | |
| 394 | Make sure the Python interpreter exists and is executable by "others". |
| 395 | |
| 396 | Make sure that any files your script needs to read or write are readable or |
| 397 | writable, respectively, by "others" --- their mode should be ``0644`` for |
| 398 | readable and ``0666`` for writable. This is because, for security reasons, the |
| 399 | HTTP server executes your script as user "nobody", without any special |
| 400 | privileges. It can only read (write, execute) files that everybody can read |
| 401 | (write, execute). The current directory at execution time is also different (it |
| 402 | is usually the server's cgi-bin directory) and the set of environment variables |
| 403 | is also different from what you get when you log in. In particular, don't count |
| 404 | on the shell's search path for executables (:envvar:`PATH`) or the Python module |
| 405 | search path (:envvar:`PYTHONPATH`) to be set to anything interesting. |
| 406 | |
| 407 | If you need to load modules from a directory which is not on Python's default |
| 408 | module search path, you can change the path in your script, before importing |
| 409 | other modules. For example:: |
| 410 | |
| 411 | import sys |
| 412 | sys.path.insert(0, "/usr/home/joe/lib/python") |
| 413 | sys.path.insert(0, "/usr/local/lib/python") |
| 414 | |
| 415 | (This way, the directory inserted last will be searched first!) |
| 416 | |
| 417 | Instructions for non-Unix systems will vary; check your HTTP server's |
| 418 | documentation (it will usually have a section on CGI scripts). |
| 419 | |
| 420 | |
| 421 | Testing your CGI script |
| 422 | ----------------------- |
| 423 | |
| 424 | Unfortunately, a CGI script will generally not run when you try it from the |
| 425 | command line, and a script that works perfectly from the command line may fail |
| 426 | mysteriously when run from the server. There's one reason why you should still |
| 427 | test your script from the command line: if it contains a syntax error, the |
| 428 | Python interpreter won't execute it at all, and the HTTP server will most likely |
| 429 | send a cryptic error to the client. |
| 430 | |
| 431 | Assuming your script has no syntax errors, yet it does not work, you have no |
| 432 | choice but to read the next section. |
| 433 | |
| 434 | |
| 435 | Debugging CGI scripts |
| 436 | --------------------- |
| 437 | |
| 438 | .. index:: pair: CGI; debugging |
| 439 | |
| 440 | First of all, check for trivial installation errors --- reading the section |
| 441 | above on installing your CGI script carefully can save you a lot of time. If |
| 442 | you wonder whether you have understood the installation procedure correctly, try |
| 443 | installing a copy of this module file (:file:`cgi.py`) as a CGI script. When |
| 444 | invoked as a script, the file will dump its environment and the contents of the |
| 445 | form in HTML form. Give it the right mode etc, and send it a request. If it's |
| 446 | installed in the standard :file:`cgi-bin` directory, it should be possible to |
| 447 | send it a request by entering a URL into your browser of the form:: |
| 448 | |
| 449 | http://yourhostname/cgi-bin/cgi.py?name=Joe+Blow&addr=At+Home |
| 450 | |
| 451 | If this gives an error of type 404, the server cannot find the script -- perhaps |
| 452 | you need to install it in a different directory. If it gives another error, |
| 453 | there's an installation problem that you should fix before trying to go any |
| 454 | further. If you get a nicely formatted listing of the environment and form |
| 455 | content (in this example, the fields should be listed as "addr" with value "At |
| 456 | Home" and "name" with value "Joe Blow"), the :file:`cgi.py` script has been |
| 457 | installed correctly. If you follow the same procedure for your own script, you |
| 458 | should now be able to debug it. |
| 459 | |
| 460 | The next step could be to call the :mod:`cgi` module's :func:`test` function |
| 461 | from your script: replace its main code with the single statement :: |
| 462 | |
| 463 | cgi.test() |
| 464 | |
| 465 | This should produce the same results as those gotten from installing the |
| 466 | :file:`cgi.py` file itself. |
| 467 | |
| 468 | When an ordinary Python script raises an unhandled exception (for whatever |
| 469 | reason: of a typo in a module name, a file that can't be opened, etc.), the |
| 470 | Python interpreter prints a nice traceback and exits. While the Python |
| 471 | interpreter will still do this when your CGI script raises an exception, most |
| 472 | likely the traceback will end up in one of the HTTP server's log files, or be |
| 473 | discarded altogether. |
| 474 | |
| 475 | Fortunately, once you have managed to get your script to execute *some* code, |
| 476 | you can easily send tracebacks to the Web browser using the :mod:`cgitb` module. |
| 477 | If you haven't done so already, just add the line:: |
| 478 | |
| 479 | import cgitb; cgitb.enable() |
| 480 | |
| 481 | to the top of your script. Then try running it again; when a problem occurs, |
| 482 | you should see a detailed report that will likely make apparent the cause of the |
| 483 | crash. |
| 484 | |
| 485 | If you suspect that there may be a problem in importing the :mod:`cgitb` module, |
| 486 | you can use an even more robust approach (which only uses built-in modules):: |
| 487 | |
| 488 | import sys |
| 489 | sys.stderr = sys.stdout |
Georg Brandl | 6911e3c | 2007-09-04 07:15:32 +0000 | [diff] [blame] | 490 | print("Content-Type: text/plain") |
| 491 | print() |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 492 | ...your code here... |
| 493 | |
| 494 | This relies on the Python interpreter to print the traceback. The content type |
| 495 | of the output is set to plain text, which disables all HTML processing. If your |
| 496 | script works, the raw HTML will be displayed by your client. If it raises an |
| 497 | exception, most likely after the first two lines have been printed, a traceback |
| 498 | will be displayed. Because no HTML interpretation is going on, the traceback |
| 499 | will be readable. |
| 500 | |
| 501 | |
| 502 | Common problems and solutions |
| 503 | ----------------------------- |
| 504 | |
| 505 | * Most HTTP servers buffer the output from CGI scripts until the script is |
| 506 | completed. This means that it is not possible to display a progress report on |
| 507 | the client's display while the script is running. |
| 508 | |
| 509 | * Check the installation instructions above. |
| 510 | |
| 511 | * Check the HTTP server's log files. (``tail -f logfile`` in a separate window |
| 512 | may be useful!) |
| 513 | |
| 514 | * Always check a script for syntax errors first, by doing something like |
| 515 | ``python script.py``. |
| 516 | |
| 517 | * If your script does not have any syntax errors, try adding ``import cgitb; |
| 518 | cgitb.enable()`` to the top of the script. |
| 519 | |
| 520 | * When invoking external programs, make sure they can be found. Usually, this |
| 521 | means using absolute path names --- :envvar:`PATH` is usually not set to a very |
| 522 | useful value in a CGI script. |
| 523 | |
| 524 | * When reading or writing external files, make sure they can be read or written |
| 525 | by the userid under which your CGI script will be running: this is typically the |
| 526 | userid under which the web server is running, or some explicitly specified |
| 527 | userid for a web server's ``suexec`` feature. |
| 528 | |
| 529 | * Don't try to give a CGI script a set-uid mode. This doesn't work on most |
| 530 | systems, and is a security liability as well. |
| 531 | |
| 532 | .. rubric:: Footnotes |
| 533 | |
| 534 | .. [#] Note that some recent versions of the HTML specification do state what order the |
| 535 | field values should be supplied in, but knowing whether a request was |
| 536 | received from a conforming browser, or even from a browser at all, is tedious |
| 537 | and error-prone. |
| 538 | |