[Python-checkins] python/dist/src/Demo/cgi cgi0.sh,NONE,1.1 cgi1.py,NONE,1.1 cgi2.py,NONE,1.1 cgi3.py,NONE,1.1

gvanrossum@users.sourceforge.net gvanrossum@users.sourceforge.net
Wed, 16 Oct 2002 14:01:29 -0700


Update of /cvsroot/python/python/dist/src/Demo/cgi
In directory usw-pr-cvs1:/tmp/cvs-serv3125

Added Files:
	cgi0.sh cgi1.py cgi2.py cgi3.py 
Log Message:
Some really simple cgi examples. cgi3 is a MiniWiki.

--- NEW FILE: cgi0.sh ---
#! /bin/sh

# If you can't get this to work, your web server isn't set up right

echo Content-type: text/plain
echo
echo Hello world
echo This is cgi0.sh

--- NEW FILE: cgi1.py ---
#!/usr/local/bin/python

"""CGI test 1 - check server setup."""

# Until you get this to work, your web server isn't set up right or
# your Python isn't set up right.

# If cgi0.sh works but cgi1.py, check the #! line and the file
# permissions.  The docs for the cgi.py module have debugging tips.

print "Content-type: text/html"
print
print "<h1>Hello world</h1>"
print "<p>This is cgi1.py"

--- NEW FILE: cgi2.py ---
#!/usr/local/bin/python

"""CGI test 2 - basic use of cgi module."""

import cgitb; cgitb.enable()

import cgi

def main():
    form = cgi.FieldStorage()
    print "Content-type: text/html"
    print
    if not form:
        print "<h1>No Form Keys</h1>"
    else:
        print "<h1>Form Keys</h1>"
        for key in form.keys():
            value = form[key].value
            print "<p>", cgi.escape(key), ":", cgi.escape(value)

if __name__ == "__main__":
    main()

--- NEW FILE: cgi3.py ---
#!/usr/local/bin/python

"""CGI test 3 (persistent data)."""

import cgitb; cgitb.enable()

import os, re, cgi, sys
escape = cgi.escape

def main():
    form = cgi.FieldStorage()
    print "Content-type: text/html"
    print
    cmd = form.getvalue("cmd") or "view"
    page = form.getvalue("page") or "FrontPage"
    wiki = WikiPage(page)
    wiki.load()
    method = getattr(wiki, 'cmd_' + cmd, None) or wiki.cmd_view
    method(form)

class WikiPage:

    homedir = os.path.dirname(sys.argv[0])
    scripturl = os.path.basename(sys.argv[0])

    def __init__(self, name):
        self.name = name
        self.load()

    def cmd_view(self, form):
        print "<h1>", escape(self.splitwikiword(self.name)), "</h1>"
        print "<p>"
        for line in self.data.splitlines():
            line = line.rstrip()
            if not line:
                print "<p>"
                continue
            words = re.split('(\W+)', line)
            for i in range(len(words)):
                word = words[i]
                if self.iswikiword(word):
                    if os.path.isfile(self.mkfile(word)):
                        word = self.mklink("view", word, word)
                    else:
                        word = self.mklink("new", word, word + "*")
                else:
                    word = escape(word)
                words[i] = word
            print "".join(words)
        print "<hr>"
        print "<p>", self.mklink("edit", self.name, "Edit this page") + ","
        print self.mklink("view", "FrontPage", "go to front page") + "."

    def cmd_edit(self, form, label="Change"):
        print "<h1>", label, self.name, "</h1>"
        print '<form method="POST" action="%s">' % self.scripturl
        s = '<textarea cols="70" rows="20" name="text">%s</textarea>'
        print s % self.data
        print '<input type="hidden" name="cmd" value="create">'
        print '<input type="hidden" name="page" value="%s">' % self.name
        print '<br>'
        print '<input type="submit" value="%s Page">' % label
        print "</form>"

    def cmd_create(self, form):
        self.data = form.getvalue("text", "").strip()
        self.store()
        self.cmd_view(form)

    def cmd_new(self, form):
        self.cmd_edit(form, label="Create Page")

    def iswikiword(self, word):
        return re.match("[A-Z][a-z]+([A-Z][a-z]*)+", word)

    def splitwikiword(self, word):
        chars = []
        for c in word:
            if chars and c.isupper():
                chars.append(' ')
            chars.append(c)
        return "".join(chars)

    def mkfile(self, name=None):
        if name is None:
            name = self.name
        return os.path.join(self.homedir, name)

    def mklink(self, cmd, page, text):
        link = self.scripturl + "?cmd=" + cmd + "&page=" + page
        return '<a href="%s">%s</a>' % (link, text)

    def load(self):
        try:
            f = open(self.mkfile())
            data = f.read().strip()
            f.close()
        except IOError:
            data = ""
        self.data = data

    def store(self):
        data = self.data
        try:
            f = open(self.mkfile(), "w")
            f.write(data)
            f.close()
            return ""
        except IOError, err:
            return "IOError: %s" % str(err)

if __name__ == "__main__":
    main()