World's ugliest Django app
OK, this is an ugly hack. But also (possibly) cool if you’re into ugly hacks.
I’ve written a small Python script that is a fully functional, self-contained, self-starting Django application. You don’t need to put it on your PYTHONPATH
or set DJANGO_SETTINGS_MODULE
. You don’t need a web server. It even creates some dummy content for you. I call it jngo.py
– it’s somewhat compressed.
The only prerequisites are a Unix-like operating system (i.e. I couldn’t tell you how to make it work on Windows), SQLite and a working install of Django trunk. It is fully “Works on My Machine” certified.
When you type python jngo.py
, it runs the syncdb
command to create a database in the working directory, then prompts you to create a superuser, then populates the database with some dummy content, then launches the built-in development server. When you go to the provided URL you’ll see something like this:
(Actually, you’ll only see the “Edit this page” link if you log in, either to the admin site at /admin/
or into the login-protected “Top Secret” page.)
Features include:
- Editable content on all pages, with “Edit this page” links for authorized users
- Dynamically generated navigation buttons
- Optional private-access pages (check “Registration required” in Flatpage edit screen)
- Optional per-page comments (check “Enable comments” in Flatpage edit screen)
- RSS feed of latest comments, with autodiscovery
All in a single file of under 60 lines of actual Python code (Though the lines containing the templates are a bit long).
The source is on dpaste.com if you’re curious. You know you are.
Scary as it is, I think it’s also a neat demo of all the stuff Django gives you for free. jngo.py uses, among other features, the syndication feed framework, the Flatpages application, the elusive comments framework, the user authentication features, and of course the glorious admin application .
Joshua Bloom commented on Mon Jan 21 21:34:03 2008:
Nicely done. Crazy how quick you can get something running with Django and python at hand.
Kent Johnson commented on Mon Jan 21 22:13:18 2008:
I couldn’t resist making a version that works with Django 0.96. It is slightly fewer lines because the call to createsuperuser() is not needed.
stubblechin commented :
I just read jngo.py…despicable, and yet…bravo!
Andy Baker commented :
Even for someone with as small an understanding of Django’s innards as me - it’s surprisingly readable. Apart from the templates!
Andy commented :
I couldn’t tell you how to make it work on Windows
It works just fine without alteration on Windows.
Paul commented :
Thanks! I should have had more faith. I updated the post accordingly.
Tane Piper commented :
Hey, this looks pretty cool :) We’re developing an app at the moment that would work well as a self-contained application and this might come in handy :)
Myles Braithwaite commented :
It is really nice to see that Django can be used like Ruby on Rails Camping and web.py.
Sandro commented :
It works on windows and mysql to have a look at http://dpaste.com/33699/
mzee.richo commented :
NIce example , thats just what django is about . Less code , Agile development .
ismail commented :
Hey man, trying to find this code but dpaste seems to have cleared it. Would it be possible to put it somewhere again? Looking at a way to package a django app. Send zip to customer and just tell them to run the command. THe app will be quite simple.
Paul commented :
OK, ismail, it’s now restored. Note that the code predates Django 1.0, so getting it running with modern Django may take a little tweaking.
Also, in case it’s useful, check out this thread where this script and a few similar options are discussed: http://stackoverflow.com/questions/1297873/how-do-i-write-a-single-file-django-app
Derek commented :
Source code at dpaste is missing?
pbx commented :
Derek – thanks for the inquiry. The fact that it disappeared means there was a 30 day stretch where nobody looked at it, so it was purged.
I’ve reinstated it at its former url: http://dpaste.com/hold/31935/
If it gets purged again I’ll take that as a sign that it should be let go!
Enjoy (and the cautions I mentioned above still apply of course).