Python CGI contact forms

10 July 2007

zetact.py - module for making CGI contact form processors in Python

I have a little contact form processor that I use on my homepage. It works for me, so I thought I would share it, following the principles of open source; namely 'release early' and 'if in doubt share it anyway, someone might find it useful'.

Here is a simple example of the form in action. The files are here. You can also browse the code online here.

It should hopefully just make sense without the rest of this post, so feel free to go there now and play with it.

As I will explain below, this form is designed to be multi-layered, you can use it with no Python knowledge at all, or you can import it as a module from within other Python code.

A contact form with layers

If you clicked on one the above links to download or browse the files online, you might be asking what do all these files do?

Basically zetact.py is the main file. This module is used to make the contact form processors.

zetact.py has two parts to it. Firstly, there is a class called FormProcessor which can be used to make more advanced forms.

There is also a function called simpleform which is used by people who do not care about Python code and just want a form now. simplecontact.py is an example of using zetact.py via the simpleform function.

The html files are just stock files that you can use to test everything, there is a README file that explains this. There is also a COPYING file that is a licence (just in case zetact.py does get into a useful state one day).

Making it right

There is a saying that goes something like "make it work, then make it right, then make it fast". I hear Python people say it often but goes back much longer, and it seems to be attributed to Alan Kay, of Smalltalk fame, assuming it is not older than that.

I probably need to do some more "make it work" on my contact form processor as it currently is only tested on Linux and Apache, it may or may not work if you run it from a Windows server. There is a lot of course that can be done to "make it right". On the programming front, I am in the painting 'for granny' rather than for the 'for national gallery' category. It is a hobby, for the sake of art rather than profit.

There are also millions of free PHP contact forms out there that do the same job, and I know there are many other ways to make a contact form using Python (e.g. Django, Turbogears etc), these are often overkill when you just want to add contact form to a basic HTML site (see Web Design for the long tail).

One advantage of the CGI approach is that is has no dependencies beyond Python and Apache, many cheap shared hosting accounts have these and will not let you install any extra software outside of your directory.

Please do report back if you try to use it

So reports on whether it works for other people would be very helpful, so people who do not know any Python but need a contact form could still test it out on your website and tell me how it did.

If you know Python and are interested in the exciting topic of HTML forms then I would gladly accept your constructive comments or ideas about improvements. I'm sure the FormProcessor class is full of "make it work" and "make it right" issues. As I said, I wrote it for Apache and Linux, I have no idea what happens if you try to use it elsewhere (such as a Windows server or some trendy other httpd), so that would be fun to.

1 David Jones says...

This is a very minor niggle about your python code:

Whilst Python is an Iverson's convention language, it is more modern style to use 'return False' and 'return True' instead of 'return 0' and 'return 1'. Of course it's up to you what versions of Python to support, but True and False have been in since 2.3.

Posted at 1:04 p.m. on July 11, 2007


2 Zeth says...

Interesting stuff, niggle away,

Posted at 2:33 p.m. on July 11, 2007


3 David Jones says...

Well then, you ought to know about r-prefix strings; they're handy for regular expressions. I just realised that since this is a comment form for a blog I have no chance of getting the blackslashes correct. Shame, since the whole point of r-prefix strings is the backslashes. Anyway, go look them up. Basically an r-prefix string, r"like this", is a string literal with an r in front of it. In an ordinary string backslashes are special, in an r-prefix string they're not. This is useful for regular expressions because backslashes crop up a lot, and if you use an ordinary string for a regular expression you end up having to double all your backslashes. With a r-prefix string you can more or less just type in the regular expression as is.

You might know all this already because the only regular expression I saw in your code was copied from someone else.

Posted at 9:36 a.m. on July 12, 2007


4 David Jones says...

Well, buoyed up by your unceasing optimism in your blog software, here goes.

So imagine you want a regular expression that matches the string «a*». Because «*» is magic in regular expressions (it's the Kleene closure) you need to escape it with a backslash. The regular expression that matches it is «a*». When converted to an ordinary Python string you need to escape the backslash:

>>> re.search('a\\*', 'a*')
<_sre.SRE_Match object at 0x3bec8>

But if you use an r-prefix string, you don't need to escape the backslash, you can just use the RE directly:

>>> re.search(r'a\*', 'a*')
<_sre.SRE_Match object at 0x6d598>

This gets even more helpful if you happen to want to match a backslash with your regular expression:

>>> re.search('\\\\\\*', '\\*')
<_sre.SRE_Match object at 0x3bec8>
>>> re.search(r'\\\*', '\\*')
<_sre.SRE_Match object at 0x6d598>

Posted at 12:53 p.m. on July 12, 2007


5 David says...

Using SMTP to send the mail: is it a good idea if you are on shared hosting and have to include ID and password information in the script??

Posted at 7:31 p.m. on July 25, 2008


6 Jordan says...

Zeth attention! Your form, http://zeth.me.uk/contact/, is not working The explorer says connecting ..but nothing happens Sorry for my poor English: I am Spanish Regards

Posted at 1:15 p.m. on November 29, 2009


7 Zeth says...

Hi Jordan, yes that URL is gone now. I have a new contact form on this site.

Posted at 6:28 p.m. on November 29, 2009


What do you have to say?

Show Editing Help

About

Hello, my name is Zeth, I'll be your host here.

Command Line Warriors is about taking control of your own technology, it looks at our experiences of computing; especially using GNU/Linux, the Python programming language, the command-line and issues such as techno-ethics, best practices and whatever is cool now. If you take control of your technology then you are a Warrior too!

This site is your site too which means that you can contribute and get involved. You can leave comments using the facility provided. For me, the comments and discussions are by far the best part of the site. So please do have your say!

Latest Discussions

Cupcake

July 31, 2010
Good post! You helped me a lot with my school project! CountryField(blank = True) < (K)
Countries in Django

LeshaShampoo

July 30, 2010
it was very interesting to read commandline.org.uk I want to quote your post in my blog. It can? And you et an account on Twitter?
Email Syntax Check in Python

vemma2018

July 30, 2010
I find myself coming to your blog more and more often to the point where my visits are almost daily now!
On Comment Spam

layecenda

July 30, 2010
Hello. And Bye.test :) http://idfjhvihdfiphvlajbvhalibv.com
PuTTY Series: Adding PuTTY to your system path

scuba

July 30, 2010
I’ve been visiting your blog for a while now and I always find a gem in your new posts. Thanks for sharing.
On Comment Spam

Businesking

July 30, 2010
Great site and articles for hack for win, I said Amazing post
How not to program WSGI

Tehnoking

July 30, 2010
This is Great post to learn about the hack Thumbs-up for you :D
How not to program WSGI

Syabiltech

July 30, 2010
I think this articles for master...because very hard to learning, As blogger beginners like me.
How not to program WSGI

coffeeatea

July 30, 2010
Are you looking for coffee gifts? We can tell you more about the coffee gifts including coffee machines and coffee pods.
Introducing Soturi - yet another Django blog application

noni juice

July 30, 2010
I just sent this post to a bunch of my friends as I agree with most of what you’re saying here and the way you’ve presented it is awesome.
On Comment Spam

Dion Moult

July 29, 2010
What I do know is that ever since I tried out Opera and put their tab bar on the left as a column, I've loved that layout. Back on Firefox ...
We need a thoughout integration of the desktop and the web - not Tab Candy superfast jellyfish

ZonaEntertainment

July 29, 2010
Wow useful articles, I'm read to learn about this and now I bookmark this to my Facebook, thanks for share!
How not to program WSGI

Giacomo

July 29, 2010
Honestly, I think both Mozilla and you are wrong :) This sort of concept adds overhead. A user would have to manage all this crap, constantly dragging and dropping, creating ...
We need a thoughout integration of the desktop and the web - not Tab Candy superfast jellyfish

Matija "hook" Šuklje

July 29, 2010
As a minimalist, you'll probybly moan if I mention KDE, but I'll do so anyway ;) The future I want (and actually see slowly fold out before me) is to ...
We need a thoughout integration of the desktop and the web - not Tab Candy superfast jellyfish

tahitian noni

July 28, 2010
Thank You For This Blog, was added to my bookmarks.
On Comment Spam

Rick

July 28, 2010
I already have piles. It's called A New Window.
We need a thoughout integration of the desktop and the web - not Tab Candy superfast jellyfish

Tech News

July 25, 2010
Thanks for this short tutorial...was auto-FTPing my files from my appserver to webserver for my tech news website. Everything was OK until someone hacked it. Hosting provider is now recommending ...
SFTP in Python: Really Simple SSH

naypalm

July 24, 2010
During the past 3-4 years, I and many others have enjoyed unlimited 2G/3G internet. But ever since the massive cult-like following of i Phone users in the US, most cellular ...
Calling time on mobile internet nonsense?

Steve

July 15, 2010
Very occasionally, you will run into a Java program that uses a lot of memory just to hold all the classes used. It turns out that the JVM uses a ...
Three classic command line tips

no

July 14, 2010
1. number one 2. number two 4. number four 3. number three 6. number six # first # second ## second-ay ## second-bee ### second-bee-one ### second-bee-two
An Introduction to ReStructuredText