PYTHON CGI PROGRAMMING (2)
PYTHON CGI PROGRAMMING (2)
http://www.tuto rialspo int.co m/pytho n/pytho n_cg i_pro g ramming .htm Co pyrig ht © tuto rials po int.co m
What is CGI?
T he Common Gateway Interface, or CGI, is a set of standards that define how information is exchang ed
between the web server and a custom script.
T he CGI specs are currently maintained by the NCSA and NCSA defines CGI is as follows:
T he Common Gateway Interface, or CGI, is a standard for external g ateway prog rams to interface with
information servers such as HT T P servers.
Web Browsing
T o understand the concept of CGI, lets see what happens when we click a hyper link to browse a particular web
pag e or URL.
Your browser contacts the HT T P web server and demands for the URL i.e., filename.
Web Server will parse the URL and will look for the filename in if it finds that file then sends it back to the
browser, otherwise sends an error messag e indicating that you have requested a wrong file.
Web browser takes response from web server and displays either the received file or error messag e.
However, it is possible to set up the HT T P server so that whenever a file in a certain directory is requested that
file is not sent back; instead it is executed as a prog ram, and whatever that prog ram outputs is sent back for your
browser to display. T his function is called the Common Gateway Interface or CGI and the prog rams are called
CGI scripts. T hese CGI prog rams can be a Python Script, PERL Script, Shell Script, C or C++ prog ram, etc.
By default, the Linux server is config ured to run only the scripts in the cg i-bin directory in /var/www. If you want
to specify any other directory to run your CGI scripts, comment the following lines in the httpd.conf file:
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<Directory "/var/www/cgi-bin">
Options All
</Directory>
Here, I assumed that you have Web Server up and running successfully and you are able to run any other CGI
prog ram like Perl or Shell, etc.
#!/usr/bin/python
print "Content-type:text/html\r\n\r\n"
print '<html>'
print '<head>'
print '<title>Hello Word - First CGI Program</title>'
print '</head>'
print '<body>'
print '<h2>Hello Word! This is my first CGI program</h2>'
print '</body>'
print '</html>'
T his hello.py script is a simple Python script, which is writing its output on ST DOUT file i.e., screen. T here is one
important and extra feature available which is first line to be printed Content-type:text/html\r\n\r\n. T his
line is sent back to the browser and specifiy the content type to be displayed on the browser screen.
Now, you must have understood basic concept of CGI and you can write many complicated CGI prog rams using
Python. T his script can interact with any other external system also to exchang e information such as RDBMS.
HTTP Header
T he line Content-type:text/html\r\n\r\n is part of HT T P header which is sent to the browser to
understand the content. All the HT T P header will be in the following form:
For Example
Content-type: text/html\r\n\r\n
T here are few other important HT T P headers, which you will use frequently in your CGI Prog ramming .
Content-type: A MIME string defining the format of the file being returned. Example is
Content-type:text/html
Expires: Date T he date the information becomes invalid. T his should be used by the
browser to decide when a pag e needs to be refreshed. A valid date string
should be in the format 01 Jan 1998 12:00:00 GMT .
Location: URL T he URL that should be returned instead of the URL requested. You can
use this field to redirect a request to any file.
Content-leng th: N T he leng th, in bytes, of the data being returned. T he browser uses this
value to report the estimated download time for a file.
CONT ENT _T YPE T he data type of the content. Used when the client is sending attached
content to the server. For example, file upload, etc.
CONT ENT _LENGT H T he leng th of the query information. It's available only for POST requests.
HT T P_COOKIE Returns the set cookies in the form of key & value pair.
HT T P_USER_AGENT T he User-Ag ent request-header field contains information about the user
ag ent orig inating the request. Its name of the web browser.
QUERY_ST RING T he URL-encoded information that is sent with GET method request.
REMOT E_ADDR T he IP address of the remote host making the request. T his can be useful
for log g ing or for authentication purpose.
REMOT E_HOST T he fully qualified name of the host making the request. If this information is
not available then REMOT E_ADDR can be used to g et IR address.
REQUEST _MET HOD T he method used to make the request. T he most common methods are
GET and POST .
SERVER_SOFT WARE T he name and version of the software the server is running .
Here is small CGI prog ram to list out all the CGI variables. Click this link to see the result Get Environment
#!/usr/bin/python
import os
http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
T he GET method is the default method to pass information from browser to web server and it produces a long
string that appears in your browser's Location:box. Never use GET method if you have password or other
sensitive information to pass to the server. T he GET method has size limtation: only 1024 characters can be sent
in a request string . T he GET method sends information using QUERY_ST RING header and will be accessible in
your CGI Prog ram throug h QUERY_ST RING environment variable.
You can pass information by simply concatenating key and value pairs along with any URL or you can use HT ML
<FORM> tag s to pass information using GET method.
Below is hello_g et.py script to handle input g iven by web browser. We are g oing to use c g i module, which
makes it very easy to access passed information:
#!/usr/bin/python
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"
Here is the actual output of the above form, You enter First and Last Name and then click submit button to see the
result.
First Name:
Last Name:
Below is same hello_g et.py script which handles GET as well as POST method.
#!/usr/bin/python
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"
Let us take ag ain same example as above which passes two values using HT ML FORM and submit button. We
are g oing to use same CGI script hello_g et.py to handle this imput.
Here is the actual output of the above form. You enter First and Last Name and then click submit button to see the
result.
First Name:
Last Name:
Maths Physics
Below is checkbox.cg i script to handle input g iven by web browser for checkbox button.
#!/usr/bin/python
if form.getvalue('physics'):
physics_flag = "ON"
else:
physics_flag = "OFF"
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Checkbox - Third CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> CheckBox Maths is : %s</h2>" % math_flag
print "<h2> CheckBox Physics is : %s</h2>" % physics_flag
print "</body>"
print "</html>"
Maths Physics
Below is radiobutton.py script to handle input g iven by web browser for radio button:
#!/usr/bin/python
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Radio - Fourth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
#!/usr/bin/python
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Entered Text Content is %s</h2>" % text_content
print "</body>"
Passing Drop Down Box Data to CGI Prog ram
Drop Down Box is used when we have many options available but only one or two will be selected.
Here is example HT ML code for a form with one drop down box:
Maths
#!/usr/bin/python
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Dropdown Box - Sixth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"
In many situations, using cookies is the most efficient method of remembering and tracking preferences,
purchases, commissions, and other information required for better visitor experience or site statistics.
How It Works?
Your server sends some data to the visitor's browser in the form of a cookie. T he browser may accept the
cookie. If it does, it is stored as a plain text record on the visitor's hard drive. Now, when the visitor arrives at
another pag e on your site, the cookie is available for retrieval. Once retrieved, your server knows/remembers
what was stored.
Expires : T he date the cookie will expire. If this is blank, the cookie will expire when the visitor quits the
browser.
Sec ure : If this field contains the word "secure", then the cookie may only be retrieved with a secure
server. If this field is blank, no such restriction exists.
Name=Value : Cookies are set and retrieved in the form of key and value pairs.
Setting up Cookies
It is very easy to send cookies to browser. T hese cookies will be sent along with HT T P Header before to
Content-type field. Assuming you want to set UserID and Password as cookies. So cookies setting will be done
as follows:
#!/usr/bin/python
print "Set-Cookie:UserID=XYZ;\r\n"
print "Set-Cookie:Password=XYZ123;\r\n"
print "Set-Cookie:Expires=Tuesday, 31-Dec-2007 23:12:40 GMT";\r\n"
print "Set-Cookie:Domain=www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path=/perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....
From this example, you must have understood how to set cookies. We use Set-Cookie HT T P header to set
cookies.
Here, it is optional to set cookies attributes like Expires, Domain and Path. It is notable that cookies are set
before sending mag ic line "Content-type:text/html\r\n\r\n.
Retrieving Cookies
It is very easy to retrieve all the set cookies. Cookies are stored in CGI environment variable HT T P_COOKIE
and they will have following form:
key1=value1;key2=value2;key3=value3....
#!/usr/bin/python
if environ.has_key('HTTP_COOKIE'):
for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
(key, value ) = split(cookie, '=');
if key == "UserID":
user_id = value
if key == "Password":
password = value
T his will produce the following result for the cookies set by above script:
User ID = XYZ
Password = XYZ123
<html>
<body>
<form enctype="multipart/form-data"
action="save_file.py" method="post">
<p>File: <input type="file" name="filename" /></p>
<p><input type="submit" value="Upload" /></p>
</form>
</body>
</html>
File:
Above example has been disabled intentionally to save people uploading file on our server, but you can try above
code with your server.
#!/usr/bin/python
import cgi, os
import cgitb; cgitb.enable()
form = cgi.FieldStorage()
else:
message = 'No file was uploaded'
print """\
Content-Type: text/html\n
<html>
<body>
<p>%s</p>
</body>
</html>
""" % (message,)
If you are running above script on Unix/Linux, then you would have to take care of replacing file separator as
follows, otherwise on your windows machine above open() statement should work fine.
fn = os.path.basename(fileitem.filename.replace("\\", "/" ))
#!/usr/bin/python
# HTTP Header
print "Content-Type:application/octet-stream; name=\"FileName\"\r\n";
print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n";
str = fo.read();
print str
Hope you enjoyed this tutorial. If yes, please send me your feedback at: Contact Us