Das dein Code so nicht funktioniert, ist dir wahrscheinlich klar. Die lokale Variable "app" existiert nicht. Das $ am Ende ist wohl auch nicht, was du bezwecken willst, denn dadurch und das ".*" enthält "app" alles, was dem Präfix "json/" folgt und das ist nicht unbedingt ein gültiger Modul-Name.
Ich würde wohl genau eine Funktion benutzen, die dann selbst weiter dispatcht, in der Hoffnung, das, was dem app-Namen folgt, nicht so kompliziert ist. Das ist schnell gemacht.
Oder du schaust dir mal an, wie django.core.urlresolvers.resolve() funktioniert. Ein RegexURLResolver hat eine Methode resolve(), die probiert, ob ein übergebener Pfad passt und ein callable und Argumente oder sonst None liefert. Dabei können beliebig viele Resolver geschachtelt werden.
Bau dir dann einen passenden Resolver selbst.
Wie funktioniert es? django.conf.urls.defaults.patterns() iteriert ihre Argumente und ruft url() für jedes Tupel (es könnte auch eine Liste sein) auf. Das include() ist syntaktischer Zucker dafür, das Argument in eine Liste zu packen. url() wiederum macht dann aus dem Pattern und dem Modul-Namen in der Liste einen RegexURLResolver. Ohne include() würde es ein RegexURLPattern werden. Der Resolver speichert in urlconf_name den Namen des Moduls und hier kannst du ansetzen.
Überschreibe resolve() derart, dass wenn dein Resolver zutrifft, nicht direkt "urlconf_module" erfragt (was über __import__ "urlconf_name" lädt), sondern in der Zeile davor, die Variablen in dem Namen aus dem Match auflöst. Du kannst nicht direkt urlconf_module benutzen, dass cacht.
Code: Alles auswählen
def resolve(self, path):
tried = []
match = self.regex.search(path)
if match:
new_path = path[match.end():]
name = self.urlconf_name % match.groupdict() # neu
patterns = self._get_urlconf_module(name).urlpatterns # neu
for pattern in patterns:
...
def _get_urlconf_module(name=None):
if not name: return # wie die alte Implementierung
if name in self._urlconf_modules: return self.urlconf_modules[name] #neu
# urlconf_name laden in in neuem Cache ablegen
...
Stefan