From bcde70e7b2bce96fc79fc19a25baf46b9de06535 Mon Sep 17 00:00:00 2001 From: Jeremy Carbaugh Date: Wed, 18 Nov 2009 10:42:36 -0500 Subject: [PATCH] make changes so that webfinger.init() will not need to be called --- wellknown/__init__.py | 18 +++++++----------- wellknown/models.py | 24 +++++++++++++++++++++--- wellknown/resources.py | 2 +- wellknown/views.py | 12 +++++++++++- 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/wellknown/__init__.py b/wellknown/__init__.py index f60a8b3..4f6c3ef 100644 --- a/wellknown/__init__.py +++ b/wellknown/__init__.py @@ -3,15 +3,17 @@ import mimetypes _cache = { } - hostmeta = HostMeta() -def register(path, handler=None, template=None, content=None, content_type=None): +def get_resource(path): + return _cache.get(path, (None, None)) + +def register(path, handler=None, template=None, content=None, content_type=None, update=False): if path in _cache: raise ValueError(u"duplicate resource for %s" % path) - if content_type is None: + if content_type is None and not update: content_type = mimetypes.guess_type(path)[0] or 'text/plain' if handler: @@ -22,11 +24,5 @@ def register(path, handler=None, template=None, content=None, content_type=None) _cache[path] = (content, content_type) else: raise ValueError(u"either handler, template, or content must be specified") - -def init(): - from django.conf import settings - from wellknown.models import Resource - for res in Resource.objects.all(): - register(res.path, content=res.content, content_type=res.content_type) - content_type = 'text/plain' if settings.DEBUG else 'application/xrd+xml' - register('host-meta', handler=hostmeta.render, content_type=content_type) \ No newline at end of file + +__all__ = ['register','hostmeta'] \ No newline at end of file diff --git a/wellknown/models.py b/wellknown/models.py index 7c5cc4f..2e45283 100644 --- a/wellknown/models.py +++ b/wellknown/models.py @@ -1,7 +1,7 @@ from django.db import models from django.db.models.signals import post_save +from wellknown import hostmeta, register import mimetypes -import wellknown class Resource(models.Model): path = models.CharField(max_length=128) @@ -26,6 +26,24 @@ def save(self, **kwargs): def save_handler(sender, **kwargs): reg = kwargs['instance'] - wellknown._cache[reg.path] = (reg.content, reg.content_type) + register( + reg.path, + content=reg.content, + content_type=reg.content_type, + update=True + ) -post_save.connect(save_handler, sender=Resource) \ No newline at end of file +post_save.connect(save_handler, sender=Resource) + +# +# cache resources +# + +for res in Resource.objects.all(): + register(res.path, content=res.content, content_type=res.content_type) + +# +# create default host-meta handler +# + +register('host-meta', handler=hostmeta, content_type='application/xrd+xml') diff --git a/wellknown/resources.py b/wellknown/resources.py index 03c473c..39c4409 100644 --- a/wellknown/resources.py +++ b/wellknown/resources.py @@ -24,6 +24,6 @@ def register_link(self, rels, uri=None, uri_template=None, title=None): self._links.append(link) - def render(self, *args, **kwargs): + def __call__(self, *args, **kwargs): data = {'hosts': self._hosts, 'links': self._links, 'lang': self._lang} return render_to_string('wellknown/host-meta.xml', data) \ No newline at end of file diff --git a/wellknown/views.py b/wellknown/views.py index 7632370..db37408 100644 --- a/wellknown/views.py +++ b/wellknown/views.py @@ -1,3 +1,4 @@ +from django.conf import settings from django.http import HttpResponse, Http404 import wellknown @@ -7,8 +8,11 @@ rules_list = None def handle(request, path, *args, **kwargs): + """ Basic handler view to either display cached content + or make call to actual handler method for rendering. + """ - (handler_or_content, content_type) = wellknown._cache.get(path, (None, None)) + (handler_or_content, content_type) = wellknown.get_resource(path) if handler_or_content is None: raise Http404() @@ -21,9 +25,15 @@ def handle(request, path, *args, **kwargs): return HttpResponse(content or '', content_type=content_type) def crossdomain(request, *args, **kwargs): + """ View that overrides /crossdomain.xml to + handle as a well-known resource. + """ return handle(request, 'crossdomain.xml', *args, **kwargs) def robots(request, *args, **kwargs): + """ Handle /robots.txt as a well-known resource or + pass off request to django-robots. + """ if rules_list: # use django-robots if it is installed return rules_list(request, *args, **kwargs) return handle(request, 'robots.txt', *args, **kwargs) \ No newline at end of file