I'm Paul Bissex, and e-scribe.com is my consulting business. I build web applications using open source software, especially Django. I teach photographers web design and professional skills. In the '90s I did graphic design for newspapers and magazines. Then I wrote technology commentary and reviews for Wired, Salon.com, Chicago Tribune, and lots of little places you've never heard of. Feel free to email me.
I'm co-author of "Python Web Development with Django", an excellent guide to my favorite web framework. Its strong points include an introduction to Python, and better coverage of Django 1.0 than nearly anybody else. Published by Addison-Wesley, it is available from Amazon and your favorite technical bookstore as well.
Built using Django, served by Apache and mod_wsgi. 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. The markup engine is Markdown.
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
At least 67572 pieces of comment spam killed since January 2008, mostly via Akismet.
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.
Thanks for reading! Please note: Your comment will not appear until approved, which may take a few hours or more. Spammers will be torpedoed.
Branching and merging in real life
7 comments
Summer Spam
1 comment
SPF-enabled spam domains
1 comment
Chess via iPod
2 comments
Aesthetics and computation
2 comments
Brett Spurrier
Software for determining image similarity?
23 days ago
nizamfarooq
eBay, fraud, filtering, and Web 2.0
59 days ago
Derek
World's ugliest Django app
90 days ago
sagar
Sort tables with sorttable.js
109 days ago
Paintball Kolbudy
Summer Spam
116 days ago
Copyright 2010
by Paul Bissex
and E-Scribe New Media
Re: packaging apps, this page might be helpful:
http://code.djangoproject.com/wiki/DosAndDontsForApplicationWriters
There is a setup.py example included.