My name is Paul Bissex, and e-scribe.com is my consulting business. I build web applications using as much open source software as possible. From September to June I teach web design and other important non-photographic professional skills to photographers. In the '90s I wrote technology commentary and reviews for magazines, newspapers, and web publications, including Wired, Salon.com, FamilyPC, the late lamented Web Review, and the Chicago Tribune. Feel free to email me.
I'm co-authoring a book, "Python Web Development with Django", with Jeff Forcier and Wesley Chun. It will be published by Prentice Hall in July 2008, but is available for pre-ordering on Amazon now.
This site is built on a fresh trunk checkout of Django, running on Python 2.5.1, served by Apache and mod_python. The database is SQLite. The operating system is FreeBSD, on a VPS hosted at Johncompanies.com. Comment-spam protection by Akismet. Vintage topo imagery from the Maptech archive.
Akismet, del.icio.us, Django, dpaste.com, Emacs, FreeBSD, Freenode, jQuery, LaunchBar, MacPorts, Markdown, Mercurial, OS X, Postfix, Python, SQLite, Subversion, TextMate, Trac, Ubuntu Linux, wmii
Copyright 2008
by Paul Bissex
and E-Scribe New Media
I built a proto-wiki in Django as an exercise for learning how to make a custom template filter. It's absurdly easy, it turns out. Per the docs I added a templatetags module; here's all the code in it -- wikitags.py:
from django.core import template
register = template.Library()
@register.filter
def wikify(value):
"Makes WikiWords"
import re
wikifier = re.compile(r'\b(([A-Z]+[a-z]+){2,})\b')
return wikifier.sub(r'<a href="/\1/">\1</a>', value)
Then, in my page template:
{% load wikitags %}
<h1>{{ page.title }}</h1>
<div class="body">
{{ page.content|wikify }}
</div>
...
I wrote about 60 lines of Python code in total. There are much smaller wiki engines, of course, but given the flexibility and expandability offered by Django I think that's pretty good.
The source code is available for anyone who'd like to take a look at it. Consider it MIT licensed if for some reason you actually want to use or extend it.
One thing this highlighted for me is that I don't know the best way to package up a Django app for re-use. Making that process easy, well understood, and perhaps even semi-automated will do a lot for Django as people start accumulating serious components.
Excellent, thanks. I came across that many months ago and then forgot about it. I think it'll be a while before I have anything substantial worth distributing, though...
Great tutorial, very to the point. Minor correction, on my version of Django the template module resides in a different place. Not sure if it has to do with Django versions. If you get errors try: (remove core)
from django import template
A suggestion that if the site were hosted it would be wonderful, we could see it in action.
Hi Ankur,
For now, there's an install here: http://demo.e-scribe.com/wiki/
However, it has absolutely no spam or XSS protection, so I won't be leaving it up forever.
Hi Paul,
Thank you for this article and for your site in general.
I have a question about protowiki. Why didn't you use the create/update/delete generic views that come with Django?
Thanks, Tom
Hi Tom, I can't actually remember why I didn't use generic views with this app. It was originally written over a year and a half ago, which is like 20 in Django years. I think that some of the wiki-specific behavior, like redirecting to an edit page on a 404, might have been more than I wanted to twist generic views to do at the time. In any case, a version that relied more on generic views (wrapping them where needed for special functionality) would be a nice update.
Everything:~ tomsmith$ hg clone static-http://hg.open.e-scribe.com abort: HTTP Error 404: Not Found
Everything:~ tomsmith$ hg clone http://hg.open.e-scribe.com destination directory: hg.open.e-scribe.com abort: 'http://hg.open.e-scribe.com/' does not appear to be an hg repository!
Thanks! This is not something I'm maintaining, but if I were to implement spam protection I'd likely base it on Akismet, like I do for my blog, possibly with DNSBLs as a first line of defense.
Comments use Markdown syntax. Your comment will not appear until approved, which may take a few hours or more. Spammers will be torpedoed.
The iPhone keyboard doesn't suck
Python one-liner of the day
7 comments
How not to advocate via Google Code
2 comments
99 problems
3 comments
bitmonk
Obscure "svn mv" problem solved
54 days ago
Charlie
Book news: Rough Cuts and Amazon
55 days ago
Simon Griffee
Django Mercurial mirror tweaks
72 days ago
Jason Calleiro
From PHP to Python
73 days ago
Yuli
dpaste.com
76 days ago
bruce
Neat Python hack: infix operators
80 days ago
David Reynolds
The original Lego Star Wars
88 days ago
At least 31791 pieces of comment spam killed since January 12th. Thanks are mostly due to Akismet.
Re: packaging apps, this page might be helpful:
http://code.djangoproject.com/wiki/DosAndDontsForApplicationWriters
There is a setup.py example included.