<?xml version="1.0" encoding="utf-8"?>
<news>
	<eligbleviewers id="eligbl1" newstosee="3">
		<newsitem id="48469094490" hide="0">
			<date>November  18, 2006</date>
			<title>About Python</title>
			<aff_link>&lt;a href="http://25f6akwb3kqffkcmzlnrxm9u9u.hop.clickbank.net/" style="font-family:arial;font-size:14px;text-decoration:underline;color:#006699;" target="_top"&gt;Tru-Guru Home Biz Mastery - High Conversion.&lt;/a&gt;</aff_link>
			<abstract>Python is an interpreted, general-purpose high-level programming language whose design philosophy emphasizes code readability. Python aims to combine "remarkable power with very clear syntax", and its standard library is large and comprehensive. Its use of indentation for block delimiters is unusual among popular programming languages.
Python supports multiple programming paradigms, primarily but not limited to object oriented, imperative and, to a lesser extent, functional programming styles. It features a fully dynamic type system and automatic memory management, similar to that of Scheme, Ruby, Perl, and Tcl. Like other dynamic languages, Python is often used as a scripting language, but is also used in a wide range of non-scripting contexts.
The reference implementation of Python (CPython) is free and open source software and has a community-based development model, as do all or nearly all of its alternative implementations. CPython is managed by the non-profit Python Software Foundation.
Python interpreters are available for many operating systems, and Python programs can be compiled into stand-alone executable code for those systems, using tools included with the interpreter installation package.</abstract>
			<description>&lt;DIV class=content&gt;
&lt;P&gt;This tutorial covers two web programming models that can be used with Python: 
the CGI standard and mod_python.&lt;/P&gt;
&lt;P&gt;As a general rule if you are in a shared host environment then your only 
option will be to run python scripts as CGI. Some specialized hosting providers 
will let you use and configure mod_python. Mod_python's performance and 
flexibility is much superior to CGI.&lt;/P&gt;
&lt;P&gt;There is no need to read the mod_python section if you want CGI and vice 
versa. They are not related to each other. To follow this tutorial it is 
required that you have a basic Python programming knowledge. If you need to 
learn how to program visit the &lt;A 
href="http://programming-crash-course.com"&gt;Python Tutorial&lt;/A&gt; first.&lt;/P&gt;
&lt;P&gt;Please post any doubt, suggestion or critique at the &lt;A 
href="http://codepoint.net/index.php/board,7.0.html" target=pcc&gt;Web Python 
Board&lt;/A&gt; and help making this a better tutorial.&lt;/P&gt;</description>
		</newsitem>
		<newsitem id="23786982724" hide="0">
			<date>November  18, 2006</date>
			<title>CGI</title>
			<description>&lt;P&gt;Some host providers only let you run CGI scripts in a certain directory, 
often named&lt;SPAN class=fixed&gt; cgi-bin&lt;/SPAN&gt;. In this case all you have to do to 
run the script is to call it like this:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed 
style="FONT-SIZE: small"&gt;http://my_server.tld/cgi-bin/my_script.py&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The script will have to be made executable by "others". Give it a 755 
permission or check the executable boxes if there is a graphical FTP 
interface.&lt;/P&gt;
&lt;P&gt;Some hosts let you run CGI scripts in any directory. In some of these hosts 
you don't have to do anything to configure the directories. In others you will 
have to add these lines to a file named&lt;SPAN class=fixed&gt; .htaccess &lt;/SPAN&gt;in 
the directory you want to run CGI scripts from:&lt;/P&gt;&lt;PRE class=program&gt;Options +ExecCGI
AddHandler cgi-script .py&lt;/PRE&gt;
&lt;P&gt;If the file does not exist create it. All directories below a directory with 
a .htaccess file will inherit the configurations. So if you want to be able to 
run CGI scripts from all directories create this file in the document root.&lt;/P&gt;
&lt;P&gt;If you are using your own server then probably you won't need to do anything 
to run a CGI script at the&lt;SPAN class=fixed&gt; cgi-bin &lt;/SPAN&gt;directory. Just make 
sure there is a line like the next in&lt;SPAN class=fixed&gt; httpd.conf &lt;/SPAN&gt;and 
that it is not commented. The trailing slashs are required.&lt;/P&gt;&lt;PRE class=program&gt;ScriptAlias /cgi-bin/ "/path/to/cgi-bin/directory/"&lt;/PRE&gt;
&lt;P&gt;If you are using the line above and want html files to be handled correctly 
in the cgi-bin directory add the next to&lt;SPAN class=fixed&gt; httpd.conf&lt;/SPAN&gt;. No 
trailing slash.&lt;/P&gt;&lt;PRE class=program&gt;&amp;lt;Directory /path/to/cgi-bin/directory&amp;gt;
   AddHandler default-handler .html .htm
&amp;lt;/Directory&amp;gt;&lt;/PRE&gt;
&lt;P&gt;To run a script saved at the root:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed 
style="FONT-SIZE: small"&gt;http://my_server.tld/my_script.py&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;If it was saved in some directory:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed 
style="FONT-SIZE: small"&gt;http://my_server.tld/some_dir/some_subdir/my_script.py&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;If your desktop is the server then execute it like this:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed 
style="FONT-SIZE: small"&gt;http://localhost/cgi-bin/my_script.py&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;In Windows, sometimes Apache will listen on port 8080. In this case the above 
address will be written with the port:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed style="FONT-SIZE: small"&gt;http://localhost:&lt;SPAN 
style="FONT-WEIGHT: bold"&gt;8080&lt;/SPAN&gt;/cgi-bin/my_script.py&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Make sure all text files you upload to the server are uploaded as text (not 
binary), specially if you are in Windows, otherwise you will have problems.&lt;/P&gt;</description>
		</newsitem>
		<newsitem id="42301366613" hide="0">
			<date>November  18, 2006</date>
			<title>Hello World</title>
			<description>&lt;P&gt;This is the classical "Hello World" in python CGI fashion:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;h2&amp;gt;Hello&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;World!&amp;lt;/h2&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;To test your setup save it with the&lt;SPAN class=fixed&gt; .py &lt;/SPAN&gt;extension, 
upload it to your server as text and make it executable before trying to run 
it.&lt;/P&gt;
&lt;P&gt;The first line of a python CGI script sets the path where the python 
interpreter will be found in the server. Ask your provider what is the correct 
one. If it is wrong the script will fail. Some examples:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/python&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/python2.3&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/python2.4&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!c:\Python24\python.exe&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!c:\Python25\python.exe&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The first 3 lines above are Linux paths and the last 2 are Windows paths.&lt;/P&gt;
&lt;P&gt;It is necessary that the script outputs the HTTP header. The HTTP header 
consists of one or more messages followed by a blank line. If the output of the 
script is to be interpreted as HTML then the content type will be&lt;SPAN 
class=fixed&gt; text/html&lt;/SPAN&gt;. The blank line signals the end of the header and 
is required.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;Many times the blank line will be written as&lt;SPAN class=fixed&gt; \n&lt;/SPAN&gt;:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html\n&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;If you change the content type to&lt;SPAN class=fixed&gt; text/plain &lt;/SPAN&gt;the 
browser will not interpret the script's output as HTML but as pure text and you 
will only see the HTML source. Try it now to never forget. A page refresh may be 
necessary for it to work.&lt;/P&gt;
&lt;H3&gt;Client versus Server&lt;/H3&gt;
&lt;P&gt;All python code will be executed at the server only. The client's agent (for 
example the browser) will never see a single line of python. Instead it will 
only get the script's output. This is something realy important to 
understand.&lt;/P&gt;
&lt;P&gt;When programming for the Web you are in a client-server environment, that is, 
do not make things like trying to open a file in the client's computer as if the 
script were running there. It isn't.&lt;/P&gt;</description>
		</newsitem>
		<newsitem id="12237437383" hide="0">
			<date>November  18, 2006</date>
			<title>Debugging</title>
			<description>&lt;P&gt;To catch syntax error messages run the script in a local shell before 
uploading to the server. Header errors are hard to catch unless you have access 
to the server logs. In case you have, look for&lt;SPAN class=fixed&gt; error_log 
&lt;/SPAN&gt;and&lt;SPAN class=fixed&gt; access_log &lt;/SPAN&gt;in Linux and for&lt;SPAN 
class=fixed&gt; error.log &lt;/SPAN&gt;and&lt;SPAN class=fixed&gt; access.log &lt;/SPAN&gt;in 
Windows.&lt;/P&gt;
&lt;P&gt;For a nice exceptions report there is the&lt;SPAN class=fixed&gt; cgitb 
&lt;/SPAN&gt;module. It will show a traceback inside a context. The default output is 
sent to standard output as HTML:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgitb; cgitb.&lt;SPAN class=syntax6&gt;enable&lt;/SPAN&gt;()
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;1&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;0&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The&lt;SPAN class=fixed&gt; handler() &lt;/SPAN&gt;method can be used to handle only the 
catched exceptions:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgitb
&lt;SPAN class=syntax8&gt;try&lt;/SPAN&gt;:
   f &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;open&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;'&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;non-existent-file.txt&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;'&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;'&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;r&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;'&lt;/SPAN&gt;)
&lt;SPAN class=syntax8&gt;except&lt;/SPAN&gt;:
   cgitb.&lt;SPAN class=syntax6&gt;handler&lt;/SPAN&gt;()&lt;/PRE&gt;
&lt;P&gt;There is also the option for a crude approach making the header "text/plain" 
and setting the standard error to standard out:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/plain&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; sys
sys.stderr &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sys.stdout
f &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;open&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;'&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;non-existent-file.txt&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;'&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;'&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;r&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;'&lt;/SPAN&gt;)&lt;/PRE&gt;
&lt;P&gt;Will output this:&lt;/P&gt;&lt;PRE&gt;Traceback (most recent call last):
  File "/var/www/html/teste/cgi-bin/text_error.py", line 6, in ?
    f = open('non-existent-file.txt', 'r')
IOError: [Errno 2] No such file or directory: 'non-existent-file.txt'&lt;/PRE&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT: bold; COLOR: red"&gt;Warning:&lt;/SPAN&gt; These techniques 
expose information that can be used by an attacker. Use it only while 
developing/debugging. Once in production disable them.</description>
		</newsitem>
		<newsitem id="21565515356" hide="0">
			<date>November  18, 2006</date>
			<title>Forms</title>
			<description>&lt;P&gt;The&lt;SPAN class=fixed&gt; FieldStorage &lt;/SPAN&gt;class of the&lt;SPAN class=fixed&gt; cgi 
&lt;/SPAN&gt;module has all that is needed to handle submited forms.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgi
form &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cgi.&lt;SPAN class=syntax6&gt;FieldStorage&lt;/SPAN&gt;() &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;instantiate&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;only&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;once!&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;It is transparent to the programmer if the data was submited by GET or by 
POST. The interface is exactly the same.&lt;/P&gt;</description>
		</newsitem>
		<newsitem id="39481950864" hide="0">
			<date>November  18, 2006</date>
			<title>Unique field names</title>
			<description>&lt;P&gt;Suppose we have this HTML form which submits a field named&lt;SPAN class="fixed"&gt; name&lt;/SPAN&gt;
			to a python CGI script named&lt;SPAN class="fixed"&gt; process_form.py&lt;/SPAN&gt;:&lt;/P&gt;
		&lt;PRE class="program"&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;html&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;body&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;form&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;method&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;get&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;action&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;process_form.py&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
Name: &lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;input&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;type&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;name&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;name&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;input&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;type&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;submit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;value&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Submit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;form&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;body&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;html&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
		&lt;P&gt;This is the&lt;SPAN class="fixed"&gt; process_form.py &lt;/SPAN&gt;script:&lt;/P&gt;
		&lt;PRE class="program"&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgi
form &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cgi.&lt;SPAN class=syntax6&gt;FieldStorage&lt;/SPAN&gt;() &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;instantiate&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;only&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;once!&lt;/SPAN&gt;
name &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; form.&lt;SPAN class=syntax6&gt;getfirst&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;name&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;empty&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Avoid&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;script&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;injection&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;escaping&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;user&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;input&lt;/SPAN&gt;
name &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cgi.&lt;SPAN class=syntax6&gt;escape&lt;/SPAN&gt;(name)

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;text/html\n&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;submitted&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;name&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;was&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;"%s"&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; name&lt;/PRE&gt;
		&lt;P&gt;The&lt;SPAN class="fixed"&gt; getfirst() &lt;/SPAN&gt;method returns the first value of the 
			named field or a default or&lt;SPAN class="fixed"&gt; None &lt;/SPAN&gt;if no field with 
			that name was submited or if it is empty. If there is more than one field with 
			the same name only the first will be returned.&lt;/P&gt;
		&lt;P&gt;If the HTML form method is changed from get to post the process_form.py script 
			will be the same.&lt;/P&gt;
		&lt;P&gt;If the user inputed data is to be shown in a HTML document then it is necessary 
			to escape it from HTML tags or else everything inside&lt;SPAN class="fixed"&gt; &amp;lt; &amp;gt; &lt;/SPAN&gt;
			will be interpreted by the HTML parser including javascript code like&lt;BR&gt;
			&lt;SPAN class="fixed"&gt;&amp;lt;script type="text/javascript"&amp;gt; malicious code here 
				&amp;lt;/script&amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
		&lt;P&gt;The&lt;SPAN class="fixed"&gt; cgi.escape() &lt;/SPAN&gt;method will transform the above into 
			safe HTML text:&lt;BR&gt;
			&lt;SPAN class="fixed"&gt;&amp;amp;lt;script type="text/javascript"&amp;amp;gt; malicious code 
				here &amp;amp;lt;/script&amp;amp;gt;&lt;/SPAN&gt;&lt;/P&gt;
		&lt;P&gt;
		This is useful not only to prevent script injection but also to make it 
		possible to display HTML source code as has just been done above.</description>
		</newsitem>
		<newsitem id="14245929550" hide="0">
			<date>November  18, 2006</date>
			<title>Multiple field names</title>
			<description>&lt;P&gt;If there is more than one field with the same name like in HTML input check 
boxes then the method to be used is&lt;SPAN class=fixed&gt; getlist()&lt;/SPAN&gt;. It will 
return a list containing as many items (the values) as checked boxes. If no 
check box was checked the list will be empty.&lt;/P&gt;
&lt;P&gt;Sample HTML with check boxes:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;html&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;body&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;form&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;method&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;post&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;action&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;process_check.py&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
Red&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;input&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;type&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;checkbox&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;name&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;color&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;value&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;red&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
Green&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;input&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;type&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;checkbox&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;name&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;color&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;value&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;green&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;input&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;type&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;submit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;value&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Submit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;form&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;body&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;html&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;And the corresponding process_check.py script:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgi
form &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cgi.&lt;SPAN class=syntax6&gt;FieldStorage&lt;/SPAN&gt;()

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;getlist()&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;returns&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;list&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;containing&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;values&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;of&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;fields&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;with&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;given&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;name&lt;/SPAN&gt;
colors &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; form.&lt;SPAN class=syntax6&gt;getlist&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;color&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html\n&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;colors&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;list:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, colors
&lt;SPAN class=syntax8&gt;for&lt;/SPAN&gt; color &lt;SPAN class=syntax8&gt;in&lt;/SPAN&gt; colors:
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, cgi.&lt;SPAN class=syntax6&gt;escape&lt;/SPAN&gt;(color), &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;/PRE&gt;</description>
		</newsitem>
		<newsitem id="25525189476" hide="0">
			<date>November  18, 2006</date>
			<title>File Upload</title>
			<description>&lt;P&gt;The python scripts in this page and in the next one will try to save an 
uploaded file in a directory named&lt;SPAN class=fixed&gt; files &lt;/SPAN&gt;in the 
directory where it is running. If the directory where the script is running 
is&lt;SPAN class=fixed&gt; /path/to/dir &lt;/SPAN&gt;then the&lt;SPAN class=fixed&gt; 
/path/to/dir/files &lt;/SPAN&gt;directory must exist. If it does not it will fail.&lt;/P&gt;
&lt;P&gt;To upload a file the HTML form must have the&lt;SPAN class=fixed&gt; enctype 
&lt;/SPAN&gt;attribute set to&lt;SPAN class=fixed&gt; multipart/form-data&lt;/SPAN&gt;. The&lt;SPAN 
class=fixed&gt; input &lt;/SPAN&gt;tag with the&lt;SPAN class=fixed&gt; file &lt;/SPAN&gt;type will 
create a "Browse" button.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;html&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;body&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;form&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;enctype&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;multipart/form-data&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;action&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;save_file.py&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;method&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;post&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;p&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;File: &lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;input&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;type&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;name&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;p&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;p&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;input&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;type&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;submit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;value&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Upload&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;p&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;form&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;body&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;html&lt;/SPAN&gt;&lt;SPAN class=syntax17&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The&lt;SPAN class=fixed&gt; getfirst() &lt;/SPAN&gt;and&lt;SPAN class=fixed&gt; getlist() 
&lt;/SPAN&gt;methods will only return the file(s) content. To also get the filename it 
is necessary to access a nested&lt;SPAN class=fixed&gt; FieldStorage &lt;/SPAN&gt;instance 
by its index in the top&lt;SPAN class=fixed&gt; FieldStorage &lt;/SPAN&gt;instance.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgi, os
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgitb; cgitb.&lt;SPAN class=syntax6&gt;enable&lt;/SPAN&gt;()

&lt;SPAN class=syntax8&gt;try&lt;/SPAN&gt;: &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Windows&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;needs&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;stdio&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;set&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;for&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;binary&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;mode.&lt;/SPAN&gt;
    &lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; msvcrt
    msvcrt.setmode (&lt;SPAN class=syntax5&gt;0&lt;/SPAN&gt;, os.O_BINARY) &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;stdin&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;0&lt;/SPAN&gt;
    msvcrt.setmode (&lt;SPAN class=syntax5&gt;1&lt;/SPAN&gt;, os.O_BINARY) &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;stdout&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;1&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;except&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;ImportError&lt;/SPAN&gt;:
    &lt;SPAN class=syntax8&gt;pass&lt;/SPAN&gt;

form &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cgi.&lt;SPAN class=syntax6&gt;FieldStorage&lt;/SPAN&gt;()

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;A&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;nested&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;FieldStorage&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;instance&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;holds&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;file&lt;/SPAN&gt;
fileitem &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; form[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;]

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Test&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;if&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;was&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;uploaded&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; fileitem.filename:
   
   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;strip&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;leading&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;path&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;from&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;name&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;avoid&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;directory&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;traversal&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;attacks&lt;/SPAN&gt;
   fn &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; os.path.&lt;SPAN class=syntax6&gt;basename&lt;/SPAN&gt;(fileitem.filename)
   &lt;SPAN class=syntax9&gt;open&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;files/&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; fn, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;wb&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;).&lt;SPAN class=syntax6&gt;write&lt;/SPAN&gt;(fileitem.&lt;SPAN class=syntax9&gt;file&lt;/SPAN&gt;.&lt;SPAN class=syntax6&gt;read&lt;/SPAN&gt;())
   message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; fn &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;was&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;uploaded&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;successfully&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   
&lt;SPAN class=syntax8&gt;else&lt;/SPAN&gt;:
   message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;No&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;was&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;uploaded&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;text/html\n&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;%s&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (message,)&lt;/PRE&gt;
&lt;P&gt;A directory traversal attack is one where the attacker submits a file with a 
leading path like in&lt;SPAN class=fixed&gt; ../../attacker_program&lt;/SPAN&gt;. This way 
he can save a program wherever the Apache user has write permission. Or read a 
file if the target script reads files.</description>
		</newsitem>
		<newsitem id="33129911534" hide="0">
			<date>November  18, 2006</date>
			<title>Big File Upload</title>
			<description>&lt;P&gt;To handle big files without using all the available memory a generator can be 
used. The generator will return the file in small chunks:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgi, os
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgitb; cgitb.&lt;SPAN class=syntax6&gt;enable&lt;/SPAN&gt;()

&lt;SPAN class=syntax8&gt;try&lt;/SPAN&gt;: &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Windows&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;needs&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;stdio&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;set&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;for&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;binary&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;mode.&lt;/SPAN&gt;
    &lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; msvcrt
    msvcrt.setmode (&lt;SPAN class=syntax5&gt;0&lt;/SPAN&gt;, os.O_BINARY) &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;stdin&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;0&lt;/SPAN&gt;
    msvcrt.setmode (&lt;SPAN class=syntax5&gt;1&lt;/SPAN&gt;, os.O_BINARY) &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;stdout&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;1&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;except&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;ImportError&lt;/SPAN&gt;:
    &lt;SPAN class=syntax8&gt;pass&lt;/SPAN&gt;

form &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cgi.&lt;SPAN class=syntax6&gt;FieldStorage&lt;/SPAN&gt;()

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Generator&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;buffer&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;chunks&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;fbuffer&lt;/SPAN&gt;(f, chunk_size&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;10000&lt;/SPAN&gt;):
   &lt;SPAN class=syntax8&gt;while&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;True&lt;/SPAN&gt;:
      chunk &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; f.&lt;SPAN class=syntax6&gt;read&lt;/SPAN&gt;(chunk_size)
      &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;not&lt;/SPAN&gt; chunk: &lt;SPAN class=syntax8&gt;break&lt;/SPAN&gt;
      &lt;SPAN class=syntax8&gt;yield&lt;/SPAN&gt; chunk
      
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;A&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;nested&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;FieldStorage&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;instance&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;holds&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;file&lt;/SPAN&gt;
fileitem &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; form[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;]

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Test&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;if&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;was&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;uploaded&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; fileitem.filename:

   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;strip&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;leading&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;path&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;from&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;name&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;avoid&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;directory&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;traversal&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;attacks&lt;/SPAN&gt;
   fn &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; os.path.&lt;SPAN class=syntax6&gt;basename&lt;/SPAN&gt;(fileitem.filename)
   f &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;open&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;files/&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; fn, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;wb&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax5&gt;10000&lt;/SPAN&gt;)

   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Read&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;chunks&lt;/SPAN&gt;
   &lt;SPAN class=syntax8&gt;for&lt;/SPAN&gt; chunk &lt;SPAN class=syntax8&gt;in&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;fbuffer&lt;/SPAN&gt;(fileitem.&lt;SPAN class=syntax9&gt;file&lt;/SPAN&gt;):
      f.&lt;SPAN class=syntax6&gt;write&lt;/SPAN&gt;(chunk)
   f.&lt;SPAN class=syntax6&gt;close&lt;/SPAN&gt;()
   message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; fn &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;was&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;uploaded&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;successfully&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;else&lt;/SPAN&gt;:
   message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;No&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;file&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;was&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;uploaded&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;text/html\n&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;%s&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (message,)&lt;/PRE&gt;</description>
		</newsitem>
		<newsitem id="26356526645" hide="0">
			<date>November  18, 2006</date>
			<title>Shell Commands</title>
			<description>&lt;P&gt;It is possible to execute shell commands through CGI. The&lt;SPAN class=fixed&gt; 
subprocess.Popen &lt;/SPAN&gt;class is what is necessary. This module is new in python 
2.4. &lt;SPAN class=fixed&gt;os.popen4&lt;/SPAN&gt; can also be used if a hosting provider 
does not offer 2.4.&lt;/P&gt;
&lt;P&gt;The script in this page is for educational purposes only. Read the &lt;A 
href="#warning"&gt;warning&lt;/A&gt;. If you need a CGI Shell use the one on the next 
page.&lt;/P&gt;
&lt;P&gt;This handy&lt;SPAN class=fixed&gt; getshellcmd.py &lt;/SPAN&gt;script gets anything in 
its query string and execute it as a shell command. It works for Unix with a 
bash shell only.&lt;/P&gt;&lt;PRE class=fixed&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/python2.4&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgitb; cgitb.&lt;SPAN class=syntax6&gt;enable&lt;/SPAN&gt;()

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;subprocess&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;module&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;new&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;2.4&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; os, urllib, subprocess &lt;SPAN class=syntax8&gt;as&lt;/SPAN&gt; sub

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Retrieve&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;command&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;from&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;query&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;string&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;and&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;unencode&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;escaped&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;%xx&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;chars&lt;/SPAN&gt;
str_command &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; urllib.&lt;SPAN class=syntax6&gt;unquote&lt;/SPAN&gt;(os.environ[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;QUERY_STRING&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;])

p &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sub.&lt;SPAN class=syntax6&gt;Popen&lt;/SPAN&gt;([&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;/bin/bash&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;-c&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, str_command], 
    stdout&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;sub.PIPE, stderr&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;sub.STDOUT)
output &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; urllib.&lt;SPAN class=syntax6&gt;unquote&lt;/SPAN&gt;(p.stdout.&lt;SPAN class=syntax6&gt;read&lt;/SPAN&gt;())

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;text/html\n&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;pre&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;$&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;%s&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;%s&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/pre&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (str_command, output)&lt;/PRE&gt;
&lt;P&gt;Say you want to install Django in your site. Without this script you would 
have to download it to your local host, decompress it, and upload the 
uncompressed files by FTP.&lt;/P&gt;
&lt;P&gt;With CGI you download it using curl or wget directly to a directory in your 
site&amp;#8216;s hierarchy like a tmp directory:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed 
style="FONT-SIZE: small"&gt;http://my_site.tld/getshellcmd.py?curl -o 
tmp/Django-0.95.tar.gz 
http://media.djangoproject.com/releases/0.95/Django-0.95.tar.gz&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The above is one only line. And the output in the browser:&lt;/P&gt;&lt;PRE style="FONT-SIZE: 10px"&gt;$ curl -o tmp/Django-0.95.tar.gz http://media.djangoproject.com/releases/0.95/Django-0.95.tar.gz
  % Total    % Received % Xferd  Average Speed          Time             Curr.
                                 Dload  Upload Total    Current  Left    Speed

  0 1257k    0  2479    0     0   7042      0  0:03:02  0:00:00  0:03:02  7042
  4 1257k    4 62727    0     0    98k      0  0:00:12  0:00:00  0:00:12  217k
 32 1257k   32  404k    0     0   241k      0  0:00:05  0:00:01  0:00:03  303k
 49 1257k   49  623k    0     0   235k      0  0:00:05  0:00:02  0:00:02  270k
 78 1257k   78  983k    0     0   271k      0  0:00:04  0:00:03  0:00:01  299k
100 1257k  100 1257k    0     0   309k      0  0:00:04  0:00:04  0:00:00  338k&lt;/PRE&gt;
&lt;P&gt;Four seconds to download 1,257k in my host provider. Now to untar it issue 
the&lt;SPAN class=fixed&gt; tar &lt;/SPAN&gt;command as the query string:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed 
style="FONT-SIZE: small"&gt;http://my_site.tld/getshellcmd.py?tar -xzvf 
tmp/Django-0.95.tar.gz&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Depending on the host absolute directory paths should be declared.&lt;/P&gt;
&lt;P&gt;&lt;SPAN id=warning style="FONT-WEIGHT: bold; COLOR: red"&gt;Warning:&lt;/SPAN&gt; If you 
ever use this sample code save it with another name and chmod it to 600 
immediately after its use. Otherwise any one in the whole world will be able to 
execute whatever he wants in your host.&lt;/P&gt;</description>
		</newsitem>
		<newsitem id="40889103847" hide="0">
			<date>November  18, 2006</date>
			<title>Safer CGI Shell</title>
			<description>&lt;P&gt;This is a CGI Shell for Unix servers with a bash shell. It has authentication 
and state management. It needs the &lt;A 
href="http://webpython.codepoint.net/a_session_class"&gt;session module&lt;/A&gt;. The 
latest version can be &lt;A 
href="http://cgpy-shell.googlecode.com/svn/trunk/"&gt;downloaded&lt;/A&gt; from the &lt;A 
href="http://code.google.com/p/cgpy-shell/"&gt;project&amp;#8216;s site&lt;/A&gt;. Get help in &lt;A 
href="http://codepoint.net/index.php/topic,33.0.html"&gt;this topic&lt;/A&gt;.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/python2.4&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgitb; cgitb.&lt;SPAN class=syntax6&gt;enable&lt;/SPAN&gt;()
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; sys, os
sys.path.&lt;SPAN class=syntax6&gt;append&lt;/SPAN&gt;(os.path.&lt;SPAN class=syntax6&gt;dirname&lt;/SPAN&gt;(os.environ[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;SCRIPT_FILENAME&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;]))
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; session, time, cgi, urllib, subprocess &lt;SPAN class=syntax8&gt;as&lt;/SPAN&gt; sub

&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;login&lt;/SPAN&gt;(form, sess):
   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;You&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;absolutely&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;need&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;change&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;these&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!!!&lt;/SPAN&gt;
   passwords &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; {&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;me&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;:&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;mine&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;friend&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;:&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;his&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;}
   username &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; form.&lt;SPAN class=syntax6&gt;getfirst&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;username&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)
   password &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; form.&lt;SPAN class=syntax6&gt;getfirst&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;password&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)
   &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; username &lt;SPAN class=syntax8&gt;and&lt;/SPAN&gt; passwords.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(username) &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; password:
      sess.&lt;SPAN class=syntax6&gt;set_expires&lt;/SPAN&gt;(&lt;SPAN class=syntax5&gt;365&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;24&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt;)
      sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;logged&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;True&lt;/SPAN&gt;
      sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;logged_until&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;() &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;10&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt;
      sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;empty_cmd&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;False&lt;/SPAN&gt;
      &lt;SPAN class=syntax8&gt;return&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;True&lt;/SPAN&gt;
   &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;not&lt;/SPAN&gt; username &lt;SPAN class=syntax8&gt;or&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;not&lt;/SPAN&gt; password:
      message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Enter&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;user&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;name&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;and&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;password&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;log&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;into&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;CGI&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Shell&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   &lt;SPAN class=syntax8&gt;elif&lt;/SPAN&gt; username &lt;SPAN class=syntax8&gt;not&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;in&lt;/SPAN&gt; passwords &lt;SPAN class=syntax8&gt;or&lt;/SPAN&gt; passwords.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(username) &lt;SPAN class=syntax18&gt;!&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; password:
      message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Wrong&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;username&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;or&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;password&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   onload &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;var&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;el&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;document.getElementById(&amp;#8216;un&amp;#8216;);&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;el.focus();&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;el.select()&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;
   &lt;SPAN class=syntax6&gt;header&lt;/SPAN&gt;(sess, onload)
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;div&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;style="border:3px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;solid&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;gray;width:350px;height:130px;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;margin:auto;padding:20px;"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;class="shell"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;%s&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;form&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;method="post"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;action="./cgi-shell.py"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;Username:&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;input&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;type="text"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;name="username"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;id="un"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;value="%s"&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;class="shell"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;style="border:1px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;lime&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;solid;padding:2px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;4px;"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;/&amp;gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;Password:&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;input&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;type="password"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;name="password"&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;class="shell"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;style="border:1px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;lime&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;solid;padding:2px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;4px;"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;/&amp;gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;p&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;style="text-align:center;"&amp;gt;&amp;lt;input&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;type="submit"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;value="Login"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;class="button"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;/&amp;gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;/form&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (message, username)
   &lt;SPAN class=syntax8&gt;return&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;False&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;end&lt;/SPAN&gt;(sess):
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   sess.&lt;SPAN class=syntax6&gt;close&lt;/SPAN&gt;()
   sys.&lt;SPAN class=syntax6&gt;exit&lt;/SPAN&gt;(&lt;SPAN class=syntax5&gt;0&lt;/SPAN&gt;)

&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;shell&lt;/SPAN&gt;(form, sess):
   sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;logged_until&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;() &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;10&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt;
   sess.data.&lt;SPAN class=syntax6&gt;setdefault&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;output&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, [])
   cmd &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; form.&lt;SPAN class=syntax6&gt;getfirst&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;cmd&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)
   cur_dir &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sess.data.&lt;SPAN class=syntax6&gt;setdefault&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;pwd&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, os.environ[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;DOCUMENT_ROOT&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;])
   &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; cmd &lt;SPAN class=syntax8&gt;or&lt;/SPAN&gt; cmd &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;and&lt;/SPAN&gt; sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;empty_cmd&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;]:
      sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;cmd&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cmd
      cmd &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; urllib.&lt;SPAN class=syntax6&gt;unquote&lt;/SPAN&gt;(cmd)
      p &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sub.&lt;SPAN class=syntax6&gt;Popen&lt;/SPAN&gt;([&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;/bin/bash&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;-c&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, cmd &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;\necho&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;$PWD&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;], 
         stdout&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;sub.PIPE, stderr&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;sub.STDOUT, cwd&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;cur_dir)
      prompt &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;[@&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; os.environ[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;SERVER_NAME&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
      prompt &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; os.path.&lt;SPAN class=syntax6&gt;basename&lt;/SPAN&gt;(cur_dir) &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;]$&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; 
      output &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; [prompt &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; cmd &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;\n&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; p.stdout.&lt;SPAN class=syntax6&gt;readlines&lt;/SPAN&gt;()
      sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;pwd&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; (output[&lt;SPAN class=syntax18&gt;-&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;1&lt;/SPAN&gt;:])[&lt;SPAN class=syntax5&gt;0&lt;/SPAN&gt;].&lt;SPAN class=syntax6&gt;rstrip&lt;/SPAN&gt;()
      sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;output&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; (sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;output&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; output)[&lt;SPAN class=syntax18&gt;-&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;501&lt;/SPAN&gt;:&lt;SPAN class=syntax18&gt;-&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;1&lt;/SPAN&gt;]
   &lt;SPAN class=syntax8&gt;else&lt;/SPAN&gt;:
      cmd &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; urllib.&lt;SPAN class=syntax6&gt;unquote&lt;/SPAN&gt;(sess.data.&lt;SPAN class=syntax6&gt;setdefault&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;cmd&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;))
   sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;empty_cmd&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;True&lt;/SPAN&gt;
   cur_dir &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;pwd&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;]
   output &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cgi.&lt;SPAN class=syntax6&gt;escape&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;.&lt;SPAN class=syntax6&gt;join&lt;/SPAN&gt;(sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;output&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;]).&lt;SPAN class=syntax6&gt;rstrip&lt;/SPAN&gt;(), &lt;SPAN class=syntax10&gt;True&lt;/SPAN&gt;)
   onload &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;window.location.href&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;#8216;#last&amp;#8216;;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;var&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;el&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;document.getElementById(&amp;#8216;cmd&amp;#8216;);el.focus();el.select();&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;
   prompt &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;[&amp;amp;#064;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; os.environ[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;SERVER_NAME&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   prompt &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; os.path.&lt;SPAN class=syntax6&gt;basename&lt;/SPAN&gt;(cur_dir) &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;]$&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; 
   &lt;SPAN class=syntax6&gt;header&lt;/SPAN&gt;(sess, onload)
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;div&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;style="width:98%%;margin:0;"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;pre&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;style="border-bottom:0;margin:0;padding:6px;width:100%%;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;overflow:auto;height:430px;border:3px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;solid&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;gray;border-bottom:0;"&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;class="shell"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;id="output"&amp;gt;%s&amp;lt;span&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;id="last"&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/pre&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;form&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;method="post"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;action="#last"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;p&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;style="margin:0;padding:6px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;6px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;8px;width:100%%;border:3px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;solid&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;gray;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;border-top:0;"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;class="shell"&amp;gt;%s&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;lt;input&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;type="text"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;name="cmd"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;value="%s"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;class="shell"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;id="cmd"&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;style="width:55%%;border:1px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;lime&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;solid;padding:2px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;4px;"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;/&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;input&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;type="submit"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;value="Submit"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;name="submit"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;class="button"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;/&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;input&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;type="submit"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;value="Logout"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;name="submit"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;class="button"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;/&amp;gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/form&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/div&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (output, prompt, cgi.&lt;SPAN class=syntax6&gt;escape&lt;/SPAN&gt;(cmd, &lt;SPAN class=syntax10&gt;True&lt;/SPAN&gt;))
   &lt;SPAN class=syntax6&gt;end&lt;/SPAN&gt;(sess)
   
&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;header&lt;/SPAN&gt;(sess, onload&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;):
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;%s&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;text/html\n&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;!DOCTYPE&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;html&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;PUBLIC&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;"-//W3C//DTD&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;XHTML&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;1.0&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;Strict//EN"&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;\n&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;CGI&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;Shell&amp;lt;/title&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;style&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;type="text/css"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;.shell&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;{font-size:12px;font-family:monospace;background-color:black;color:lime;}&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/style&amp;gt;\n&amp;lt;/head&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;body&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;onload="%s"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;style="background-color:lightgray;font-family:monospace;"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;h2&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;style="text-align:center;margin:8px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;auto"&amp;gt;CGI&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;Shell&amp;lt;/h2&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (sess.cookie, onload)

&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;main&lt;/SPAN&gt;():
   sess &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; session.&lt;SPAN class=syntax6&gt;Session&lt;/SPAN&gt;()
   form &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cgi.&lt;SPAN class=syntax6&gt;FieldStorage&lt;/SPAN&gt;()
   &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; form.&lt;SPAN class=syntax6&gt;getfirst&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;submit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;) &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Logout&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;or&lt;/SPAN&gt; \
      sess.data.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;logged_until&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax5&gt;0&lt;/SPAN&gt;) &lt;SPAN class=syntax18&gt;&amp;lt;&lt;/SPAN&gt; time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;():
      sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;logged&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;False&lt;/SPAN&gt;
   &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;not&lt;/SPAN&gt; sess.data.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;logged&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;) &lt;SPAN class=syntax8&gt;and&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;not&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;login&lt;/SPAN&gt;(form, sess):
      &lt;SPAN class=syntax6&gt;end&lt;/SPAN&gt;(sess)
   &lt;SPAN class=syntax6&gt;shell&lt;/SPAN&gt;(form, sess)

&lt;SPAN class=syntax6&gt;main&lt;/SPAN&gt;()&lt;/PRE&gt;</description>
		</newsitem>
		<newsitem id="31089305578" hide="0">
			<date>November  18, 2006</date>
			<title>Cookies</title>
			<description>&lt;P&gt;HTTP is said to be a stateless protocol. What this means for web programmers 
is that every time a user loads a page it is the first time for the server. The 
server can&amp;#8216;t say whether this user has ever visited that site, if is he in the 
middle of a buying transaction, if he has already authenticated, etc.&lt;/P&gt;
&lt;P&gt;A cookie is a tag that can be placed on the user&amp;#8216;s computer. Whenever the 
user loads a page from a site the site&amp;#8216;s script can send him a cookie. The 
cookie can contain anything the site needs to identify that user. Then within 
the next request the user does for a new page there goes back the cookie with 
all the pertinent information to be read by the script.&lt;/P&gt;</description>
		</newsitem>
		<newsitem id="5327089719" hide="0">
			<date>November  18, 2006</date>
			<title>Set the Cookie</title>
			<description>&lt;P&gt;There are two basic cookie operations. The first is to set the cookie as an 
HTTP header to be sent to the client. The second is to read the cookie returned 
from the client also as an HTTP header.&lt;/P&gt;
&lt;P&gt;This script will do the first one placing a cookie on the client&amp;#8216;s 
browser:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; time

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;This&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;message&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;that&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;contains&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;and&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;will&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;be&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;sent&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;HTTP&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;header&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;client&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Set-Cookie:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;str&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;());

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;To&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;save&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;one&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;line&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;of&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;code&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;we&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;replaced&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;print&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;command&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;with&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;&amp;#8216;\n&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html\n&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;End&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;of&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;HTTP&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;header&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Server&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;time&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, time.&lt;SPAN class=syntax6&gt;asctime&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;localtime&lt;/SPAN&gt;())
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The&lt;SPAN class=fixed&gt; Set-Cookie &lt;/SPAN&gt;header contains the cookie. Save and 
run this code from your browser and take a look at the cookie saved there. 
Search for the cookie name, lastvisit, or for the domain name, or the server IP 
like 10.1.1.1 or 127.0.0.1.&lt;/P&gt;
&lt;H3&gt;The Cookie Object&lt;/H3&gt;
&lt;P&gt;The Cookie module can save us a lot of coding and errors and the next pages 
will use it in all cookie operations.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; time, Cookie

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Instantiate&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;SimpleCookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;object&lt;/SPAN&gt;
cookie &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; Cookie.&lt;SPAN class=syntax6&gt;SimpleCookie&lt;/SPAN&gt;()

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;SimpleCookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;instance&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;mapping&lt;/SPAN&gt;
cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;str&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;())

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Output&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;HTTP&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;message&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;containing&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; cookie
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html\n&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Server&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;time&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, time.&lt;SPAN class=syntax6&gt;asctime&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;localtime&lt;/SPAN&gt;())
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;It does not seem as much for this extremely simple code, but wait until it 
gets complex and the Cookie module will be your friend.</description>
		</newsitem>
		<newsitem id="16441225535" hide="0">
			<date>November  18, 2006</date>
			<title>Retrieve the Cookie</title>
			<description>&lt;P&gt;The returned cookie will be available as a string in the&lt;SPAN class=fixed&gt; 
os.environ &lt;/SPAN&gt;dictionary with the key&lt;SPAN class=fixed&gt; 
&amp;#8216;HTTP_COOKIE&amp;#8216;&lt;/SPAN&gt;:&lt;/P&gt;&lt;PRE class=program&gt;cookie_string &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; os.environ.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;HTTP_COOKIE&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)&lt;/PRE&gt;
&lt;P&gt;The&lt;SPAN class=fixed&gt; load() &lt;/SPAN&gt;method of the SimpleCookie object will 
parse that string rebuilding the object&amp;#8216;s mapping:&lt;/P&gt;&lt;PRE class=program&gt;   cookie.&lt;SPAN class=syntax6&gt;load&lt;/SPAN&gt;(cookie_string)&lt;/PRE&gt;
&lt;P&gt;Complete code:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; Cookie, os, time

cookie &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; Cookie.&lt;SPAN class=syntax6&gt;SimpleCookie&lt;/SPAN&gt;()
cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;str&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;())

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; cookie
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html\n&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;p&amp;gt;Server&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;time&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, time.&lt;SPAN class=syntax6&gt;asctime&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;localtime&lt;/SPAN&gt;()), &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;returned&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;available&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;os.environ&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;dictionary&lt;/SPAN&gt;
cookie_string &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; os.environ.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;HTTP_COOKIE&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;first&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;time&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;page&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;run&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;there&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;will&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;be&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;no&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookies&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;not&lt;/SPAN&gt; cookie_string:
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;p&amp;gt;First&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;visit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;or&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;cookies&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;disabled&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;else&lt;/SPAN&gt;: &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Run&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;page&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;twice&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;retrieve&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;p&amp;gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;returned&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;string&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;was&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; cookie_string &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;"&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;load()&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;parses&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;string&lt;/SPAN&gt;
   cookie.&lt;SPAN class=syntax6&gt;load&lt;/SPAN&gt;(cookie_string)
   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Use&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;value&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;attribute&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;of&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;get&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;it&lt;/SPAN&gt;
   lastvisit &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;float&lt;/SPAN&gt;(cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;].value)
   
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;p&amp;gt;Your&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;last&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;visit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;was&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;at&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;,
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; time.&lt;SPAN class=syntax6&gt;asctime&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;localtime&lt;/SPAN&gt;(lastvisit)), &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;When the client first loads the page there will be no cookie in the client&amp;#8216;s 
computer to be returned. The second time the page is requested then the cookie 
saved in the last run will be sent to the server.</description>
		</newsitem>
		<newsitem id="22155432294" hide="0">
			<date>November  18, 2006</date>
			<title>Morsels</title>
			<description>&lt;P&gt;In the previous cookie retrieve program the lastvisit cookie value was 
retrieved through its&lt;SPAN class=fixed&gt; value &lt;/SPAN&gt;attribute:&lt;/P&gt;&lt;PRE class=program&gt;   lastvisit &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;float&lt;/SPAN&gt;(cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;].value)&lt;/PRE&gt;
&lt;P&gt;When a new key is set for a SimpleCookie object a Morsel instance is 
created:&lt;/P&gt;&lt;PRE class=shell&gt;&amp;gt;&amp;gt;&amp;gt; import Cookie
&amp;gt;&amp;gt;&amp;gt; import time
&amp;gt;&amp;gt;&amp;gt;
&amp;gt;&amp;gt;&amp;gt; cookie = Cookie.SimpleCookie()
&amp;gt;&amp;gt;&amp;gt; cookie
&amp;lt;SimpleCookie: &amp;gt;
&amp;gt;&amp;gt;&amp;gt;
&amp;gt;&amp;gt;&amp;gt; cookie[&amp;#8216;lastvisit&amp;#8216;] = str(time.time())
&amp;gt;&amp;gt;&amp;gt; cookie[&amp;#8216;lastvisit&amp;#8216;]
&amp;lt;Morsel: lastvisit=&amp;#8216;1159535133.33&amp;#8216;&amp;gt;
&amp;gt;&amp;gt;&amp;gt;
&amp;gt;&amp;gt;&amp;gt; cookie[&amp;#8216;lastvisit&amp;#8216;].value
&amp;#8216;1159535133.33&amp;#8216;
&lt;/PRE&gt;
&lt;P&gt;Each cookie, a Morsel instance, can only have a predefined set of keys: 
expires, path, commnent, domain, max-age, secure and version. Any other key will 
raise an exception.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; Cookie, time

cookie &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; Cookie.&lt;SPAN class=syntax6&gt;SimpleCookie&lt;/SPAN&gt;()

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;name/value&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;pair&lt;/SPAN&gt;
cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;str&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;())

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;expires&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;x&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;seconds&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;after&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;output.&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;default&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;expire&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;when&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;browser&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;closed&lt;/SPAN&gt;
cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;expires&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;30&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;24&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt;

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;path&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;which&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;valid.&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;if&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;set&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;&amp;#8216;/&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;it&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;will&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;valid&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;whole&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;domain.&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;default&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;script&amp;#8216;s&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;path.&lt;/SPAN&gt;
cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;path&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;/cgi-bin/&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;purpose&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;of&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;be&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;inspected&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;by&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;user&lt;/SPAN&gt;
cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;comment&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;holds&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;last&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;user\&amp;#8216;s&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;visit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;date&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;domain&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;which&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;valid.&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;always&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;stars&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;with&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;dot.&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;make&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;it&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;available&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;all&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;subdomains&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;specify&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;only&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;domain&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;like&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;.my_site.com&lt;/SPAN&gt;
cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;domain&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;.www.my_site.com&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;discard&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;x&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;seconds&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;after&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;output&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;not&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;supported&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;most&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;browsers&lt;/SPAN&gt;
cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;max-age&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;30&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;24&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt;

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;secure&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;has&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;no&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;value.&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;If&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;set&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;directs&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;user&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;agent&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;use&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;only&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;(unspecified)&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;secure&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;means&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;contact&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;origin&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;server&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;whenever&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;it&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;sends&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;back&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;this&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;
cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;secure&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;decimal&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;integer,&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;identifies&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;which&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;version&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;of&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;state&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;management&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;specification&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;conforms.&lt;/SPAN&gt;
cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;version&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;1&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html\n&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, cookie, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;for&lt;/SPAN&gt; morsel &lt;SPAN class=syntax8&gt;in&lt;/SPAN&gt; cookie:
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, morsel, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, cookie[morsel].value
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;div&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;style="margin:-1em&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;auto&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;auto&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;3em;"&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   &lt;SPAN class=syntax8&gt;for&lt;/SPAN&gt; key &lt;SPAN class=syntax8&gt;in&lt;/SPAN&gt; cookie[morsel]:
      &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; key, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, cookie[morsel][key], &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;br&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;/&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/div&amp;gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;Notice that&lt;SPAN class=fixed&gt; print cookie &lt;/SPAN&gt;automaticaly formats the 
expire date.</description>
		</newsitem>
		<newsitem id="9619881542" hide="0">
			<date>November  18, 2006</date>
			<title>Sessions</title>
			<description>&lt;P&gt;Sessions are the server side version of cookies. While a cookie persists data 
(or state) at the client, sessions do it at the server. Sessions have the 
advantage that the data do not travel the network thus making it both safer and 
faster although this not entirely true as shown in the next paragraph&lt;/P&gt;
&lt;P&gt;The session state is kept in a file or in a database at the server side. Each 
session is identified by an id or session id (SID). To make it possible to the 
client to identify himself to the server the SID must be created by the server 
and sent to the client and then sent back to the server whenever the client 
makes a request. There is still data going through the net, the SID.&lt;/P&gt;
&lt;P&gt;The server can send the SID to the client in a link&amp;#8216;s query string or in a 
hidden form field or as a&lt;SPAN class=fixed&gt; Set-Cookie &lt;/SPAN&gt;header. The SID 
can be sent back from the client to the server as a query string parameter or in 
the body of the HTTP message if the post method is used or in a&lt;SPAN 
class=fixed&gt; Cookie &lt;/SPAN&gt;HTTP header.&lt;/P&gt;
&lt;P&gt;If a cookie is not used to store the SID then the session will only last 
until the browser is closed, or the user goes to another site breaking the POST 
or query string transmission, or in other words, the session will last only 
until the user leaves the site.&lt;/P&gt;</description>
		</newsitem>
		<newsitem id="3292224406" hide="0">
			<date>November  18, 2006</date>
			<title>Cookie Based SID</title>
			<description>&lt;P&gt;A cookie based session has the advantage that it lasts until the cookie 
expires and, as only the SID travels the net, it is faster and safer. The 
disadvantage is that the client must have cookies enabled.&lt;/P&gt;
&lt;P&gt;The only particularity with the cookie used to set a session is its 
value:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;will&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;be&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;hash&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;of&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;server&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;time&lt;/SPAN&gt;
   sid &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sha.&lt;SPAN class=syntax6&gt;new&lt;/SPAN&gt;(&lt;SPAN class=syntax9&gt;repr&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;())).&lt;SPAN class=syntax6&gt;hexdigest&lt;/SPAN&gt;()&lt;/PRE&gt;
&lt;P&gt;The hash of the server time makes an unique SID for each session.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; sha, time, Cookie, os

cookie &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; Cookie.&lt;SPAN class=syntax6&gt;SimpleCookie&lt;/SPAN&gt;()
string_cookie &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; os.environ.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;HTTP_COOKIE&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;If&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;new&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;session&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;not&lt;/SPAN&gt; string_cookie:
   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;will&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;be&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;hash&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;of&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;server&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;time&lt;/SPAN&gt;
   sid &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sha.&lt;SPAN class=syntax6&gt;new&lt;/SPAN&gt;(&lt;SPAN class=syntax9&gt;repr&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;())).&lt;SPAN class=syntax6&gt;hexdigest&lt;/SPAN&gt;()
   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Set&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;
   cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sid
   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Will&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;expire&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;year&lt;/SPAN&gt;
   cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;expires&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;12&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;30&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;24&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt; &lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;If&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;already&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;existent&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;session&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;else&lt;/SPAN&gt;:
   cookie.&lt;SPAN class=syntax6&gt;load&lt;/SPAN&gt;(string_cookie)
   sid &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;].value

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; cookie
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;text/html\n&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; string_cookie:
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;p&amp;gt;Already&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;existent&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;session&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;else&lt;/SPAN&gt;:
   &lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;p&amp;gt;New&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;session&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;p&amp;gt;SID&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, sid, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;In every page the existence of the cookie must be tested. If it does not 
exist then redirect to a login page or just create it if a login or a previous 
state is not required.</description>
		</newsitem>
		<newsitem id="29644379960" hide="0">
			<date>November  18, 2006</date>
			<title>Query String SID</title>
			<description>&lt;P&gt;Query string based session:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; sha, time, cgi, os

sid &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cgi.&lt;SPAN class=syntax6&gt;FieldStorage&lt;/SPAN&gt;().&lt;SPAN class=syntax6&gt;getfirst&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)

&lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; sid: &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;If&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;session&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;exists&lt;/SPAN&gt;
   message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Already&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;existent&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;session&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;else&lt;/SPAN&gt;: &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;New&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;session&lt;/SPAN&gt;
   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;will&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;be&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;hash&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;of&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;server&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;time&lt;/SPAN&gt;
   sid &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sha.&lt;SPAN class=syntax6&gt;new&lt;/SPAN&gt;(&lt;SPAN class=syntax9&gt;repr&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;())).&lt;SPAN class=syntax6&gt;hexdigest&lt;/SPAN&gt;()
   message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;New&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;session&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

qs &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; sid

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;text/html\n&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;%s&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;SID&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;%s&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;&amp;lt;a&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;href="./set_sid_qs.py?sid=%s"&amp;gt;reload&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (message, sid, sid)&lt;/PRE&gt;
&lt;P&gt;To mantain a session you will have to append the query string to all the 
links in the page.&lt;/P&gt;
&lt;P&gt;Save this file as&lt;SPAN class=fixed&gt; set_sid_qs.py &lt;/SPAN&gt;and run it two or 
more times. Try to close the browser and call the page again. The session is 
gone. The same happens if the page address is typed in the address bar.</description>
		</newsitem>
		<newsitem id="45752315639" hide="0">
			<date>November  18, 2006</date>
			<title>Hidden Field SID</title>
			<description>&lt;P&gt;The hidden form field SID is almost the same as the query string based one, 
sharing the same problems.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; sha, time, cgi, os

sid &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cgi.&lt;SPAN class=syntax6&gt;FieldStorage&lt;/SPAN&gt;().&lt;SPAN class=syntax6&gt;getfirst&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)

&lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; sid: &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;If&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;session&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;exists&lt;/SPAN&gt;
   message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Already&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;existent&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;session&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;else&lt;/SPAN&gt;: &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;New&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;session&lt;/SPAN&gt;
   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;will&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;be&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;hash&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;of&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;server&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;time&lt;/SPAN&gt;
   sid &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sha.&lt;SPAN class=syntax6&gt;new&lt;/SPAN&gt;(&lt;SPAN class=syntax9&gt;repr&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;())).&lt;SPAN class=syntax6&gt;hexdigest&lt;/SPAN&gt;()
   message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;New&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;session&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

qs &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; sid

&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;text/html\n&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;%s&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;p&amp;gt;SID&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;%s&amp;lt;/p&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;form&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;method="post"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;input&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;type="hidden"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;name=sid&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;value="%s"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;input&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;type="submit"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;value="Submit"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/form&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (message, sid, sid)&lt;/PRE&gt;</description>
		</newsitem>
		<newsitem id="41422021421" hide="0">
			<date>November  18, 2006</date>
			<title>A Session Class</title>
			<description>&lt;P&gt;Since session state maintenance happens in many pages a session class is in 
order.&lt;/P&gt;
&lt;P&gt;Save the next program as session.py and import it in all pages in which 
session state is required. The session object will try to create a directory 
named&lt;SPAN class=fixed&gt; session &lt;/SPAN&gt;in the document root if it doesn&amp;#8216;t exist. 
If it can&amp;#8216;t you will have to create it yourself and chmod it to 2770.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; sha, shelve, time, Cookie, os

&lt;SPAN class=syntax8&gt;class&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;Session&lt;/SPAN&gt;(&lt;SPAN class=syntax9&gt;object&lt;/SPAN&gt;):

   &lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;__init__&lt;/SPAN&gt;(self, expires&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax10&gt;None&lt;/SPAN&gt;, cookie_path&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax10&gt;None&lt;/SPAN&gt;):
      string_cookie &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; os.environ.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;HTTP_COOKIE&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;, &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)
      self.cookie &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; Cookie.&lt;SPAN class=syntax6&gt;SimpleCookie&lt;/SPAN&gt;()
      self.cookie.&lt;SPAN class=syntax6&gt;load&lt;/SPAN&gt;(string_cookie)

      &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; self.cookie.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;):
         sid &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; self.cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;].value
         &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Clear&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;session&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;from&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;other&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;cookies&lt;/SPAN&gt;
         self.cookie.&lt;SPAN class=syntax6&gt;clear&lt;/SPAN&gt;()

      &lt;SPAN class=syntax8&gt;else&lt;/SPAN&gt;:
         self.cookie.&lt;SPAN class=syntax6&gt;clear&lt;/SPAN&gt;()
         sid &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sha.&lt;SPAN class=syntax6&gt;new&lt;/SPAN&gt;(&lt;SPAN class=syntax9&gt;repr&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;())).&lt;SPAN class=syntax6&gt;hexdigest&lt;/SPAN&gt;()

      self.cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sid

      &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; cookie_path:
         self.cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;path&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; cookie_path

      session_dir &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; os.environ[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;DOCUMENT_ROOT&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;/session&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
      &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;not&lt;/SPAN&gt; os.path.&lt;SPAN class=syntax6&gt;exists&lt;/SPAN&gt;(session_dir):
         &lt;SPAN class=syntax8&gt;try&lt;/SPAN&gt;:
            os.&lt;SPAN class=syntax6&gt;mkdir&lt;/SPAN&gt;(session_dir, &lt;SPAN class=syntax5&gt;02770&lt;/SPAN&gt;)
         &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;If&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;apache&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;user&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;can&amp;#8216;t&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;create&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;it&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;create&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;it&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;manualy&lt;/SPAN&gt;
         &lt;SPAN class=syntax8&gt;except&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;OSError&lt;/SPAN&gt;, e:
            errmsg &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;  &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;%s&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;when&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;trying&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;create&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;session&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;directory.&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;Create&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;it&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;as&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;&amp;#8216;%s&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (e.strerror, os.path.&lt;SPAN class=syntax6&gt;abspath&lt;/SPAN&gt;(session_dir))
            &lt;SPAN class=syntax8&gt;raise&lt;/SPAN&gt; &lt;SPAN class=syntax10&gt;OSError&lt;/SPAN&gt;, errmsg
      self.data &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; shelve.&lt;SPAN class=syntax9&gt;open&lt;/SPAN&gt;(session_dir &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;/sess_&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; sid, writeback&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax10&gt;True&lt;/SPAN&gt;)
      os.&lt;SPAN class=syntax6&gt;chmod&lt;/SPAN&gt;(session_dir &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;/sess_&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; sid, &lt;SPAN class=syntax5&gt;0660&lt;/SPAN&gt;)
      
      &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Initializes&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;expires&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;data&lt;/SPAN&gt;
      &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; &lt;SPAN class=syntax8&gt;not&lt;/SPAN&gt; self.data.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;):
         self.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; {&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;expires&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;:&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;}

      self.&lt;SPAN class=syntax6&gt;set_expires&lt;/SPAN&gt;(expires)

   &lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;close&lt;/SPAN&gt;(self):
      self.data.&lt;SPAN class=syntax6&gt;close&lt;/SPAN&gt;()

   &lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;set_expires&lt;/SPAN&gt;(self, expires&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax10&gt;None&lt;/SPAN&gt;):
      &lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; expires &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;:
         self.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;expires&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
      &lt;SPAN class=syntax8&gt;elif&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;isinstance&lt;/SPAN&gt;(expires, &lt;SPAN class=syntax9&gt;int&lt;/SPAN&gt;):
         self.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;expires&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; expires
         
      self.cookie[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;sid&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;expires&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; self.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;cookie&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;][&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;expires&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;]&lt;/PRE&gt;
&lt;P&gt;An example of the session class usage:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;!/usr/bin/env&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;python&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; cgitb; cgitb.&lt;SPAN class=syntax6&gt;enable&lt;/SPAN&gt;()

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Some&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;hosts&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;will&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;need&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;have&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;document_root&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;appended&lt;/SPAN&gt;
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;sys.path&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;be&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;able&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;find&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;user&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;modules&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; sys, os
sys.path.&lt;SPAN class=syntax6&gt;append&lt;/SPAN&gt;(os.environ[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;DOCUMENT_ROOT&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;])

&lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; session, time

sess &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; session.&lt;SPAN class=syntax6&gt;Session&lt;/SPAN&gt;(expires&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;365&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;24&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt;, cookie_path&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;/&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;expires&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;can&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;be&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;reset&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;at&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;any&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;moment:&lt;/SPAN&gt;
sess.&lt;SPAN class=syntax6&gt;set_expires&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;or&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;changed:&lt;/SPAN&gt;
sess.&lt;SPAN class=syntax6&gt;set_expires&lt;/SPAN&gt;(&lt;SPAN class=syntax5&gt;30&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;24&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;*&lt;/SPAN&gt;&lt;SPAN class=syntax5&gt;60&lt;/SPAN&gt;)

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Session&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;data&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;dictionary&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;like&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;object&lt;/SPAN&gt;
lastvisit &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; sess.data.&lt;SPAN class=syntax6&gt;get&lt;/SPAN&gt;(&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;)
&lt;SPAN class=syntax8&gt;if&lt;/SPAN&gt; lastvisit:
   message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Welcome&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;back.&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;Your&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;last&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;visit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;was&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;at&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt; \
      time.&lt;SPAN class=syntax6&gt;asctime&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;gmtime&lt;/SPAN&gt;(&lt;SPAN class=syntax9&gt;float&lt;/SPAN&gt;(lastvisit)))
&lt;SPAN class=syntax8&gt;else&lt;/SPAN&gt;:
   message &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;New&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;session&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Save&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;current&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;time&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;in&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;session&lt;/SPAN&gt;
sess.data[&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;lastvisit&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;] &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;repr&lt;/SPAN&gt;(time.&lt;SPAN class=syntax6&gt;time&lt;/SPAN&gt;())
&lt;SPAN class=syntax8&gt;print&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;%s&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;Content-Type:&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;text/plain\n&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;sess.cookie&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;%s&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;sess.data&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;=&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;%s&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;%s&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt; &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (sess.cookie, sess.cookie, sess.data, message)
sess.&lt;SPAN class=syntax6&gt;close&lt;/SPAN&gt;()</description>
		</newsitem>
		<newsitem id="16220389121" hide="0">
			<date>November  18, 2006</date>
			<title>Mod_python</title>
			<description>&lt;P&gt;Mod_python is an Apache module only. Mod_python version 3.x requires Apache 
2.x and Python 2.2.1. For Apache 1.3 only mod_python 2.x can be used. This 
tutorial requires mod_python 3.1+&lt;/P&gt;
&lt;H3&gt;Much faster than CGI&lt;/H3&gt;
&lt;P&gt;For every requested CGI page the Python interpreter must be launched. With 
mod_python Apache starts one main interpreter for the main server and one 
subinterpreter for each virtual host and these interpreters will be reused for 
all requests. They will never finish until the server is shut down.&lt;/P&gt;
&lt;H3&gt;Mod_python handlers&lt;/H3&gt;
&lt;P&gt;Apache processes requests in phases. A handler is a function that processes a 
particular phase of a request. Handlers are provided by Apache and by its 
modules, like mod_python.&lt;/P&gt;
&lt;P&gt;A number of handlers are available in mod_python. Most of them are low level 
replacements for Apache handlers but two, Publisher and PSP, are high level and 
will be covered here.&lt;/P&gt;
&lt;P&gt;The PSP handler processes text documents with Python code embedded 
between&lt;SPAN class=fixed&gt; server tags &lt;/span&gt; &lt;span class="fixed"&gt; &lt;/SPAN&gt; and 
transform it in pure Python code, much like PHP and ASP. If you are used to 
these and don&amp;#8216;t wan&amp;#8216;t to learn a new web programming paradigm then PSP is your 
choice.&lt;/P&gt;
&lt;P&gt;The Publisher handler allows access to functions and variables within a 
module via URLs. It avoids the spagetthi coding style thus giving the code a 
much more application like appearance.</description>
		</newsitem>
		<newsitem id="15557823259" hide="0">
			<date>November  18, 2006</date>
			<title>Apache Configuration</title>
			<description>&lt;P&gt;There are two options to configure the Publisher handler.&lt;/P&gt;
&lt;H3&gt;SetHandler directive&lt;/H3&gt;
&lt;P&gt;This will be used in this tutorial. If you want to follow it exactly use it 
yourserf and avoid plenty of confusion. In this configuration all files in a 
directory will be handled by the Publisher.&lt;/P&gt;&lt;PRE class=program&gt;&amp;lt;Directory /path/to/publisher/directory&amp;gt;
   SetHandler mod_python
   PythonHandler mod_python.publisher
   PythonDebug On
&amp;lt;/Directory&amp;gt;&lt;/PRE&gt;
&lt;P&gt;The lines above must be included in the Apache&lt;SPAN class=fixed&gt; httpd.conf 
&lt;/SPAN&gt;file or in the&lt;SPAN class=fixed&gt; .htaccess &lt;/SPAN&gt;file. The &lt;SPAN 
class=fixed&gt;&amp;lt;Directory&amp;gt; &lt;/SPAN&gt;directive must not be used inside the&lt;SPAN 
class=fixed&gt; .htacces &lt;/SPAN&gt;file. Instead use only the three internal 
lines.&lt;/P&gt;
&lt;P&gt;The first line,&lt;SPAN class=fixed&gt; SetHandler mod_python&lt;/SPAN&gt;, tells Apache 
that all the files in that directory will be handled by mod_python, regardless 
of the file extension.&lt;/P&gt;
&lt;P&gt;The second line,&lt;SPAN class=fixed&gt; PythonHandler mod_python.publisher&lt;/SPAN&gt;, 
is a mod_python directive. The mod_python handler to be used here is the 
Publisher.&lt;/P&gt;
&lt;P&gt;The third line, &lt;SPAN class=fixed&gt;PythonDebug On&lt;/SPAN&gt;, sets mod_python to 
send error messages to the standard output, quite convenient for debugging. 
Should be deleted when in production.&lt;/P&gt;
&lt;P&gt;This configuration will be used in the next pages. It enables a traversal 
algorithm a bit more convenient than the configuration shown next. That is, it 
allows the index page of the site to be executed when no page is declared in the 
URL as in&lt;SPAN class=fixed&gt; http://mysite.tld&lt;/SPAN&gt;. Also there is no need to 
write the&lt;SPAN class=fixed&gt; .py &lt;/SPAN&gt;extension.&lt;/P&gt;
&lt;P&gt;If there is the need to serve static files from the same directory add 
this:&lt;/P&gt;&lt;PRE class=program&gt;&amp;lt;Files ~ "\.(gif|html|jpg|png)$"&amp;gt;
   SetHandler default-handler
&amp;lt;/Files&amp;gt;&lt;/PRE&gt;
&lt;H3&gt;AddHandler directive&lt;/H3&gt;
&lt;P&gt;The second option to configure the Publisher handler is changing the&lt;SPAN 
class=fixed&gt; SetHandler &lt;/SPAN&gt;directive to:&lt;/P&gt;&lt;PRE class=program&gt;AddHandler mod_python .py&lt;/PRE&gt;
&lt;P&gt;With this directive all other file types will be handled by their default 
handlers without the need to set them. But it will be necessary to use the&lt;SPAN 
class=fixed&gt; .py &lt;/SPAN&gt;extension in the URIs.</description>
		</newsitem>
		<newsitem id="12074982072" hide="0">
			<date>November  18, 2006</date>
			<title>Hello World</title>
			<description>&lt;P&gt;If the next script is saved as&lt;SPAN class=fixed&gt; hello.py &lt;/SPAN&gt;in the&lt;SPAN 
class=fixed&gt; /dir/path &lt;/SPAN&gt;directory under the document root then we can 
execute it with:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed&gt;http://my_site.tld/dir/path/hello.py&lt;/SPAN&gt; or&lt;BR&gt;&lt;SPAN 
class=fixed&gt;http://my_site.tld/dir/path/hello&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;index&lt;/SPAN&gt;():
   s &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;h2&amp;gt;Hello&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;World!&amp;lt;/h2&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;
   &lt;SPAN class=syntax8&gt;return&lt;/SPAN&gt; s&lt;/PRE&gt;
&lt;P&gt;The document root is the default directory where Apache looks for the 
requested files. Find out what it is looking for the&lt;SPAN class=fixed&gt; 
DocumentRoot &lt;/SPAN&gt;directive in the&lt;SPAN class=fixed&gt; httpd.conf 
&lt;/SPAN&gt;file.&lt;/P&gt;
&lt;P&gt;The&lt;SPAN class=fixed&gt; /dir/path &lt;/SPAN&gt;is the path to the directory 
configured to be handled by the Publisher.</description>
		</newsitem>
		<newsitem id="15861199264" hide="0">
			<date>November  18, 2006</date>
			<title>URI Traversal</title>
			<description>&lt;P&gt;If the previous&lt;SPAN class=fixed&gt; hello.py &lt;/SPAN&gt;script was saved as&lt;SPAN 
class=fixed&gt; index.py &lt;/SPAN&gt;then it could be executed as any of:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed&gt;http://my_site.tld/dir/path/&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN 
class=fixed&gt;http://my_site.tld/dir/path/index&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN 
class=fixed&gt;http://my_site.tld/dir/path/index.py&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;The Publisher handler will execute the module named in the URI. If there is 
no module in the URI it will look for index.py.&lt;/P&gt;
&lt;P&gt;The following script has two functions and it is possible to choose which one 
will be executed.&lt;/P&gt;&lt;PRE class=program&gt;s &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;h2&amp;gt;Hello&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;%s!&amp;lt;/h2&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;index&lt;/SPAN&gt;():
   &lt;SPAN class=syntax8&gt;return&lt;/SPAN&gt; s &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;World&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   
&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;everybody&lt;/SPAN&gt;():
   &lt;SPAN class=syntax8&gt;return&lt;/SPAN&gt; s &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;everybody&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The function to be called can be passed in the URI. If the previous script 
was saved as&lt;SPAN class=fixed&gt; index.py &lt;/SPAN&gt;the&lt;SPAN class=fixed&gt; everybody() 
&lt;/SPAN&gt;function could be executed as any of:&lt;/P&gt;
&lt;P&gt;&lt;SPAN 
class=fixed&gt;http://my_site.tld/dir/path/index.py/everybody&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN 
class=fixed&gt;http://my_site.tld/dir/path/index/everybody&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN 
class=fixed&gt;http://my_site.tld/dir/path/everybody&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;If no function is found in the URI then the function called by default is 
the&lt;SPAN class=fixed&gt; index() &lt;/SPAN&gt;function.&lt;/P&gt;</description>
		</newsitem>
		<newsitem id="8785627552" hide="0">
			<date>November  18, 2006</date>
			<title>Objects Visibility</title>
			<description>&lt;P&gt;It is not possible to publish a module. Either an object within the module is 
present in the URI or the module has an index function. Otherwise the Publisher 
will return a "404 Not Found" to the client. If the next script is saved as&lt;SPAN 
class=fixed&gt; my_module.py &lt;/SPAN&gt;the only way to execute it is:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed&gt;http://my_site.tld/dir/path/my_module/main&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN 
class=fixed&gt;http://my_site.tld/dir/path/my_module.py/main&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Global variables are also visible:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed&gt;http://my_site.tld/dir/path/my_module.py/s&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN 
class=fixed&gt;http://my_site.tld/dir/path/my_module/s&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE class=program&gt;s &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;h2&amp;gt;I&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;can&amp;#8216;t&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;be&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;published&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;as&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;a&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;module!&amp;lt;/h2&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;main&lt;/SPAN&gt;():
   &lt;SPAN class=syntax8&gt;return&lt;/SPAN&gt; s
   
&lt;SPAN class=syntax6&gt;main&lt;/SPAN&gt;()&lt;/PRE&gt;
&lt;P&gt;Only the objects inside the module are visible. It is not possible to call 
the module like:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed&gt;http://my_site.tld/dir/path/my_module&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN 
class=fixed&gt;http://my_site.tld/dir/path/my_module.py&lt;/SPAN&gt;&lt;/P&gt;
&lt;H3&gt;Hide objects from the web&lt;/H3&gt;
&lt;P&gt;As objects inside a module can be published it may be necessary to hide some 
of them. If an object name starts with an underscore it will be hidden from the 
web.&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;_s&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;variable&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;not&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;visible&lt;/SPAN&gt;
_s &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;h2&amp;gt;%s&amp;lt;/h2&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;

&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;f&lt;/SPAN&gt;():
   x &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;y&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   &lt;SPAN class=syntax8&gt;return&lt;/SPAN&gt; s &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;f()&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;function&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
   
&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;v&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;variable&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;is&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;visible&lt;/SPAN&gt;
v &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; _s &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;v&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;variable&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;In the example above the&lt;SPAN class=fixed&gt; _s &lt;/SPAN&gt;variable is not visible, 
that is it can&amp;#8216;t be shown with:&lt;/P&gt;
&lt;P&gt;&lt;SPAN class=fixed&gt;http://my_site.tld/dir/path/objects.py/_s&lt;/SPAN&gt;&lt;/P&gt;</description>
		</newsitem>
		<newsitem id="32166325072" hide="0">
			<date>November  18, 2006</date>
			<title>Request Object</title>
			<description>&lt;P&gt;The Publisher passes a&lt;SPAN class=fixed&gt; Request &lt;/SPAN&gt;object to every 
function it calls that declares it as an argument. This script will retrieve 
most of its attributes:&lt;/P&gt;&lt;PRE class=program&gt;&lt;SPAN class=syntax8&gt;from&lt;/SPAN&gt; cgi &lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; escape
&lt;SPAN class=syntax8&gt;from&lt;/SPAN&gt; urllib &lt;SPAN class=syntax8&gt;import&lt;/SPAN&gt; unquote

&lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;The&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Publisher&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;passes&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Request&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;object&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;to&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;function&lt;/SPAN&gt;
&lt;SPAN class=syntax8&gt;def&lt;/SPAN&gt; &lt;SPAN class=syntax6&gt;index&lt;/SPAN&gt;(req):
   s &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;\&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;style&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;type="text/css"&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;td&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;{padding:0.2em&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;0.5em;border:1px&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;solid&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;black;}&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;table&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;{border-collapse:collapse;}&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/style&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;table&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;cellspacing="0"&lt;/SPAN&gt;&lt;SPAN class=syntax14&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax14&gt;cellpadding="0"&amp;gt;%s&amp;lt;/table&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/SPAN&gt;
&lt;SPAN class=syntax14&gt;"""&lt;/SPAN&gt;
   attribs &lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;

   &lt;SPAN class=syntax1&gt;#&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Loop&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;over&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;the&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;Request&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;object&lt;/SPAN&gt;&lt;SPAN class=syntax1&gt; &lt;/SPAN&gt;&lt;SPAN class=syntax1&gt;attributes&lt;/SPAN&gt;
   &lt;SPAN class=syntax8&gt;for&lt;/SPAN&gt; attrib &lt;SPAN class=syntax8&gt;in&lt;/SPAN&gt; &lt;SPAN class=syntax9&gt;dir&lt;/SPAN&gt;(req):
      attribs &lt;SPAN class=syntax18&gt;+&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; &lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;%s&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;%s&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/SPAN&gt;&lt;SPAN class=syntax13&gt;&amp;#8216;&lt;/SPAN&gt;
      attribs &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt;&lt;SPAN class=syntax18&gt;=&lt;/SPAN&gt; (attrib, &lt;SPAN class=syntax6&gt;escape&lt;/SPAN&gt;(&lt;SPAN class=syntax6&gt;unquote&lt;/SPAN&gt;(&lt;SPAN class=syntax9&gt;str&lt;/SPAN&gt;(req.&lt;SPAN class=syntax10&gt;__getattribute__&lt;/SPAN&gt;(attrib)))))

   &lt;SPAN class=syntax8&gt;return&lt;/SPAN&gt; s &lt;SPAN class=syntax18&gt;%&lt;/SPAN&gt; (attribs)&lt;/PRE&gt;
&lt;P&gt;&lt;A href="http://webpython.codepoint.net/files/other/request.html"&gt;View the 
output&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;It is not necessary to have the&lt;SPAN class=fixed&gt; Request &lt;/SPAN&gt;object as an 
argument in the function if it will not be used. The Publisher knows when it is 
necessary for the object to be passed.&lt;/P&gt;</description>
		</newsitem>
		<newsitem id="16715084383" hide="0">
			<date>November  18, 2006</date>
			<title>Code License</title>
			<description>&lt;P&gt;All code, and only the code, in webpython.codepoint.net is free software; you 
can redistribute it and/or modify it under the terms of the GNU General Public 
License as published by the Free Software Foundation; either version 2 of the 
License, or (at your option) any later version.&lt;/P&gt;
&lt;P&gt;All code in webpython.codepoint.net is distributed in the hope that it will 
be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 
License for more details.&lt;/P&gt;
&lt;P&gt;Copyright (C) 2006 Clodoaldo Pinto Neto cpn@codepoint.net&lt;/P&gt;
&lt;P&gt;Preamble&lt;/P&gt;
&lt;P&gt;The licenses for most software are designed to take away your freedom to 
share and change it. By contrast, the GNU General Public License is intended to 
guarantee your freedom to share and change free software--to make sure the 
software is free for all its users. This General Public License applies to most 
of the Free Software Foundation&amp;#8216;s software and to any other program whose 
authors commit to using it. (Some other Free Software Foundation software is 
covered by the GNU Lesser General Public License instead.) You can apply it to 
your programs, too.&lt;/P&gt;
&lt;P&gt;When we speak of free software, we are referring to freedom, not price. Our 
General Public Licenses are designed to make sure that you have the freedom to 
distribute copies of free software (and charge for this service if you wish), 
that you receive source code or can get it if you want it, that you can change 
the software or use pieces of it in new free programs; and that you know you can 
do these things.&lt;/P&gt;
&lt;P&gt;To protect your rights, we need to make restrictions that forbid anyone to 
deny you these rights or to ask you to surrender the rights. These restrictions 
translate to certain responsibilities for you if you distribute copies of the 
software, or if you modify it.&lt;/P&gt;
&lt;P&gt;For example, if you distribute copies of such a program, whether gratis or 
for a fee, you must give the recipients all the rights that you have. You must 
make sure that they, too, receive or can get the source code. And you must show 
them these terms so they know their rights.&lt;/P&gt;
&lt;P&gt;We protect your rights with two steps: (1) copyright the software, and (2) 
offer you this license which gives you legal permission to copy, distribute 
and/or modify the software.&lt;/P&gt;
&lt;P&gt;Also, for each author&amp;#8216;s protection and ours, we want to make certain that 
everyone understands that there is no warranty for this free software. If the 
software is modified by someone else and passed on, we want its recipients to 
know that what they have is not the original, so that any problems introduced by 
others will not reflect on the original authors&amp;#8216; reputations.&lt;/P&gt;
&lt;P&gt;Finally, any free program is threatened constantly by software patents. We 
wish to avoid the danger that redistributors of a free program will individually 
obtain patent licenses, in effect making the program proprietary. To prevent 
this, we have made it clear that any patent must be licensed for everyone&amp;#8216;s free 
use or not licensed at all.&lt;/P&gt;
&lt;P&gt;The precise terms and conditions for copying, distribution and modification 
follow.&lt;BR&gt;TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION&lt;/P&gt;
&lt;P&gt;0. This License applies to any program or other work which contains a notice 
placed by the copyright holder saying it may be distributed under the terms of 
this General Public License. The "Program", below, refers to any such program or 
work, and a "work based on the Program" means either the Program or any 
derivative work under copyright law: that is to say, a work containing the 
Program or a portion of it, either verbatim or with modifications and/or 
translated into another language. (Hereinafter, translation is included without 
limitation in the term "modification".) Each licensee is addressed as "you".&lt;/P&gt;
&lt;P&gt;Activities other than copying, distribution and modification are not covered 
by this License; they are outside its scope. The act of running the Program is 
not restricted, and the output from the Program is covered only if its contents 
constitute a work based on the Program (independent of having been made by 
running the Program). Whether that is true depends on what the Program does.&lt;/P&gt;
&lt;P&gt;1. You may copy and distribute verbatim copies of the Program&amp;#8216;s source code 
as you receive it, in any medium, provided that you conspicuously and 
appropriately publish on each copy an appropriate copyright notice and 
disclaimer of warranty; keep intact all the notices that refer to this License 
and to the absence of any warranty; and give any other recipients of the Program 
a copy of this License along with the Program.&lt;/P&gt;
&lt;P&gt;You may charge a fee for the physical act of transferring a copy, and you may 
at your option offer warranty protection in exchange for a fee.&lt;/P&gt;
&lt;P&gt;2. You may modify your copy or copies of the Program or any portion of it, 
thus forming a work based on the Program, and copy and distribute such 
modifications or work under the terms of Section 1 above, provided that you also 
meet all of these conditions:&lt;/P&gt;
&lt;P&gt;a) You must cause the modified files to carry prominent notices stating that 
you changed the files and the date of any change.&lt;BR&gt;b) You must cause any work 
that you distribute or publish, that in whole or in part contains or is derived 
from the Program or any part thereof, to be licensed as a whole at no charge to 
all third parties under the terms of this License.&lt;BR&gt;c) If the modified program 
normally reads commands interactively when run, you must cause it, when started 
running for such interactive use in the most ordinary way, to print or display 
an announcement including an appropriate copyright notice and a notice that 
there is no warranty (or else, saying that you provide a warranty) and that 
users may redistribute the program under these conditions, and telling the user 
how to view a copy of this License. (Exception: if the Program itself is 
interactive but does not normally print such an announcement, your work based on 
the Program is not required to print an announcement.) &lt;/P&gt;
&lt;P&gt;These requirements apply to the modified work as a whole. If identifiable 
sections of that work are not derived from the Program, and can be reasonably 
considered independent and separate works in themselves, then this License, and 
its terms, do not apply to those sections when you distribute them as separate 
works. But when you distribute the same sections as part of a whole which is a 
work based on the Program, the distribution of the whole must be on the terms of 
this License, whose permissions for other licensees extend to the entire whole, 
and thus to each and every part regardless of who wrote it.&lt;/P&gt;
&lt;P&gt;Thus, it is not the intent of this section to claim rights or contest your 
rights to work written entirely by you; rather, the intent is to exercise the 
right to control the distribution of derivative or collective works based on the 
Program.&lt;/P&gt;
&lt;P&gt;In addition, mere aggregation of another work not based on the Program with 
the Program (or with a work based on the Program) on a volume of a storage or 
distribution medium does not bring the other work under the scope of this 
License.&lt;/P&gt;
&lt;P&gt;3. You may copy and distribute the Program (or a work based on it, under 
Section 2) in object code or executable form under the terms of Sections 1 and 2 
above provided that you also do one of the following:&lt;/P&gt;
&lt;P&gt;a) Accompany it with the complete corresponding machine-readable source code, 
which must be distributed under the terms of Sections 1 and 2 above on a medium 
customarily used for software interchange; or,&lt;BR&gt;b) Accompany it with a written 
offer, valid for at least three years, to give any third party, for a charge no 
more than your cost of physically performing source distribution, a complete 
machine-readable copy of the corresponding source code, to be distributed under 
the terms of Sections 1 and 2 above on a medium customarily used for software 
interchange; or,&lt;BR&gt;c) Accompany it with the information you received as to the 
offer to distribute corresponding source code. (This alternative is allowed only 
for noncommercial distribution and only if you received the program in object 
code or executable form with such an offer, in accord with Subsection b above.) 
&lt;/P&gt;
&lt;P&gt;The source code for a work means the preferred form of the work for making 
modifications to it. For an executable work, complete source code means all the 
source code for all modules it contains, plus any associated interface 
definition files, plus the scripts used to control compilation and installation 
of the executable. However, as a special exception, the source code distributed 
need not include anything that is normally distributed (in either source or 
binary form) with the major components (compiler, kernel, and so on) of the 
operating system on which the executable runs, unless that component itself 
accompanies the executable.&lt;/P&gt;
&lt;P&gt;If distribution of executable or object code is made by offering access to 
copy from a designated place, then offering equivalent access to copy the source 
code from the same place counts as distribution of the source code, even though 
third parties are not compelled to copy the source along with the object 
code.&lt;/P&gt;
&lt;P&gt;4. You may not copy, modify, sublicense, or distribute the Program except as 
expressly provided under this License. Any attempt otherwise to copy, modify, 
sublicense or distribute the Program is void, and will automatically terminate 
your rights under this License. However, parties who have received copies, or 
rights, from you under this License will not have their licenses terminated so 
long as such parties remain in full compliance.&lt;/P&gt;
&lt;P&gt;5. You are not required to accept this License, since you have not signed it. 
However, nothing else grants you permission to modify or distribute the Program 
or its derivative works. These actions are prohibited by law if you do not 
accept this License. Therefore, by modifying or distributing the Program (or any 
work based on the Program), you indicate your acceptance of this License to do 
so, and all its terms and conditions for copying, distributing or modifying the 
Program or works based on it.&lt;/P&gt;
&lt;P&gt;6. Each time you redistribute the Program (or any work based on the Program), 
the recipient automatically receives a license from the original licensor to 
copy, distribute or modify the Program subject to these terms and conditions. 
You may not impose any further restrictions on the recipients&amp;#8216; exercise of the 
rights granted herein. You are not responsible for enforcing compliance by third 
parties to this License.&lt;/P&gt;
&lt;P&gt;7. If, as a consequence of a court judgment or allegation of patent 
infringement or for any other reason (not limited to patent issues), conditions 
are imposed on you (whether by court order, agreement or otherwise) that 
contradict the conditions of this License, they do not excuse you from the 
conditions of this License. If you cannot distribute so as to satisfy 
simultaneously your obligations under this License and any other pertinent 
obligations, then as a consequence you may not distribute the Program at all. 
For example, if a patent license would not permit royalty-free redistribution of 
the Program by all those who receive copies directly or indirectly through you, 
then the only way you could satisfy both it and this License would be to refrain 
entirely from distribution of the Program.&lt;/P&gt;
&lt;P&gt;If any portion of this section is held invalid or unenforceable under any 
particular circumstance, the balance of the section is intended to apply and the 
section as a whole is intended to apply in other circumstances.&lt;/P&gt;
&lt;P&gt;It is not the purpose of this section to induce you to infringe any patents 
or other property right claims or to contest validity of any such claims; this 
section has the sole purpose of protecting the integrity of the free software 
distribution system, which is implemented by public license practices. Many 
people have made generous contributions to the wide range of software 
distributed through that system in reliance on consistent application of that 
system; it is up to the author/donor to decide if he or she is willing to 
distribute software through any other system and a licensee cannot impose that 
choice.&lt;/P&gt;
&lt;P&gt;This section is intended to make thoroughly clear what is believed to be a 
consequence of the rest of this License.&lt;/P&gt;
&lt;P&gt;8. If the distribution and/or use of the Program is restricted in certain 
countries either by patents or by copyrighted interfaces, the original copyright 
holder who places the Program under this License may add an explicit 
geographical distribution limitation excluding those countries, so that 
distribution is permitted only in or among countries not thus excluded. In such 
case, this License incorporates the limitation as if written in the body of this 
License.&lt;/P&gt;
&lt;P&gt;9. The Free Software Foundation may publish revised and/or new versions of 
the General Public License from time to time. Such new versions will be similar 
in spirit to the present version, but may differ in detail to address new 
problems or concerns.&lt;/P&gt;
&lt;P&gt;Each version is given a distinguishing version number. If the Program 
specifies a version number of this License which applies to it and "any later 
version", you have the option of following the terms and conditions either of 
that version or of any later version published by the Free Software Foundation. 
If the Program does not specify a version number of this License, you may choose 
any version ever published by the Free Software Foundation.&lt;/P&gt;
&lt;P&gt;10. If you wish to incorporate parts of the Program into other free programs 
whose distribution conditions are different, write to the author to ask for 
permission. For software which is copyrighted by the Free Software Foundation, 
write to the Free Software Foundation; we sometimes make exceptions for this. 
Our decision will be guided by the two goals of preserving the free status of 
all derivatives of our free software and of promoting the sharing and reuse of 
software generally.&lt;/P&gt;
&lt;P&gt;NO WARRANTY&lt;/P&gt;
&lt;P&gt;11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR 
THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE 
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM 
"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, 
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE 
PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.&lt;/P&gt;
&lt;P&gt;12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR 
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA 
BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A 
FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER 
OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</description>
		</newsitem>
		<newsitem id="13644701211" hide="0">
			<date>November  18, 2006</date>
			<title>Recommended Books</title>
			<description>&lt;TABLE 
style="PADDING-RIGHT: 1em; PADDING-LEFT: 1em; PADDING-BOTTOM: 1em; MARGIN: auto; PADDING-TOP: 1em; TEXT-ALIGN: center" 
cellSpacing=0 cellPadding=0 border=0 ID="Table1"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD style="WIDTH: 220px"&gt;&lt;A 
href="http://www.amazon.com/gp/product/1565925092?ie=UTF8&amp;amp;tag=fhstat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=1565925092"&gt;&lt;BR&gt;&lt;IMG 
style="BORDER-RIGHT: gray 1px solid; BORDER-TOP: gray 1px solid; BORDER-LEFT: gray 1px solid; BORDER-BOTTOM: gray 1px solid" 
height=240 src="http://webpython.codepoint.net/files/http://www.softxml.com/images/http_guide.jpg" 
width=190&gt;&lt;/A&gt;&lt;BR&gt;&lt;IMG 
style="MARGIN: 0px; BORDER-TOP-STYLE: none! important; BORDER-RIGHT-STYLE: none! important; BORDER-LEFT-STYLE: none! important; BORDER-BOTTOM-STYLE: none! important" 
height=1 alt="" 
src="http://www.assoc-amazon.com/e/ir?t=fhstat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=1565925092" 
width=1 border=0&gt; &lt;/TD&gt;
&lt;TD style="WIDTH: 220px"&gt;&lt;A 
href="http://www.amazon.com/gp/product/0596100469?ie=UTF8&amp;amp;tag=fhstat-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=0596100469"&gt;&lt;BR&gt;&lt;IMG 
height=240 src="http://webpython.codepoint.net/files/http://www.softxml.com/images/python_nutshell.jpg" 
width=160&gt;&lt;/A&gt;&lt;BR&gt;&lt;IMG 
style="MARGIN: 0px; BORDER-TOP-STYLE: none! important; BORDER-RIGHT-STYLE: none! important; BORDER-LEFT-STYLE: none! important; BORDER-BOTTOM-STYLE: none! important" 
height=1 alt="" 
src="http://www.assoc-amazon.com/e/ir?t=fhstat-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0596100469" 
width=1 border=0&gt; 
&lt;P&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
		</newsitem>
	</eligbleviewers>
	<eligbleviewers id="eligbl2" newstosee="5" status1="99" status2="100">
	</eligbleviewers>
	<eligbleviewers id="eligbl3" newstosee="5" status1="199" status2="1200"/>
</news>