Oh yes, I figured that Django would be very RESTian-friendly from the URL dispatching. I did some digging around for Atom publishing modules (parsing seems to be pretty well taken care of with feedparser and ElementTree) and after some false starts, I found quite a good publisher in ... django! (d'oh!). It's clean and relatively simple to follow. For those who don't know it's in utils.feedgenerator.py.
Thing is, there seems to be something amiss; from django.utils import feedgenerator import datetime f = feedgenerator.Atom1Feed( title = u"My Weblog", link = u"http://www.example.com/", description = u"In which I write about what I ate today.", categories = ('sex', 'drugs', 'rock and roll'), language = u"en", ) myenclosure = feedgenerator.Enclosure( url = u'https://resourcebank.ncl.ac.uk/resource/access/download/fa85c3c1-0ff5-466c-8cb1-83936d4b1b93/CPT_presentation_Case_B_-_Group_3.ppt', length = u'1019821', mime_type = u'application/powerpoint', ) when = datetime.datetime(2005,11,24) print when f.add_item(title=u"Hot dog today", link = u"http://www.example.com/entries/1/", pubdate = feedgenerator.rfc3339_date(when), description = u"<p>sort it out son!</p>", enclosure = myenclosure, unique_id = None, ) print f.writeString('utf8') The resourcebank link does not exist ;) What comes out is this; 2005-11-24 00:00:00 --> ['__add__', '__class__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__ne__', '__new__', '__radd__', '__reduce__', '__reduce_ex__', '__repr__', '__rsub__', '__setattr__', '__str__', '__sub__', 'astimezone', 'combine', 'ctime', 'date', 'day', 'dst', 'fromordinal', 'fromtimestamp', 'hour', 'isocalendar', 'isoformat', 'isoweekday', 'max', 'microsecond', 'min', 'minute', 'month', 'now', 'replace', 'resolution', 'second', 'strftime', 'time', 'timetuple', 'timetz', 'today', 'toordinal', 'tzinfo', 'tzname', 'utcfromtimestamp', 'utcnow', 'utcoffset', 'utctimetuple', 'weekday', 'year'] --> ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__str__', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'replace', 'rfind', 'rindex', 'rjust', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] Traceback (most recent call last): File "/Users/tonymcd/Projects/Python/atom/django_atom.py", line 29, in ? print f.writeString('utf8') File "/Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/site-packages/django/utils/feedgenerator.py", line 99, in writeString self.write(s, encoding) File "/Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/site-packages/django/utils/feedgenerator.py", line 201, in write handler.addQuickElement(u"updated", rfc3339_date(self.latest_post_date()).decode('ascii')) File "/Library/Frameworks/Python.framework/Versions/2.4/lib/python2.4/site-packages/django/utils/feedgenerator.py", line 32, in rfc3339_date return date.strftime('%Y-%m-%dT%H:%M:%SZ') AttributeError: 'str' object has no attribute 'strftime' The --> is a debug line put into feedgenerator.rfc3339 def rfc3339_date(date): print "-->", dir(date) return date.strftime('%Y-%m-%dT%H:%M:%SZ') There's two outputs (first when rfc3339 is called in my code and second when writeString('utf8') takes over). Can anyone point out where I'm being completely stupid here?