Django: agrega dinámicamente aplicaciones como complemento, creación de URL y otras configuraciones automáticamente

Tengo la siguiente estructura de mis carpetas en Django:

./project_root ./app ./fixtures/ ./static/ ./templates/ ./blog/ ./settings.py ./urls.py ./views.py ./manage.py ./__init__.py ./plugin ./code_editor ./static ./templates ./urls.py ./views.py ./__init__.py ./code_viewer ./static ./templates ./urls.py ./views.py ./__init__.py 

Entonces, ¿cómo puedo hacer que urls.py raíz compile automáticamente la lista de urls buscando otras urls.py basadas en INSTALLED_APPS? Cambio settings.py para construir INSTALLED_APPS, TEMPLATES_DIR, STATICFILES_DIRS dinámicamente. (Significa que no sé cuántos complementos se instalarán en diferentes servidores. Debería verificarlo dinámicamente en el tiempo de ejecución y agregarlo) en:

 python manage.py runserver 

Aquí está el código para agregar INSTALLED_APPS, TEMPATES_DIR, STATICFILES_DIR.

 PLUGINS_DIR = '/path_to/plugins/' for item in os.listdir(PLUGINS_DIR): if os.path.isdir(os.path.join(PLUGINS_DIR, item)): plugin_name = 'app.plugins.%s' % item if plugin_name not in INSTALLED_APPS: INSTALLED_APPS = INSTALLED_APPS+(plugin_name,) template_dir = os.path.join(PLUGINS_DIR, '%s/templates/' % item) if os.path.isdir(template_dir): if template_dir not in TEMPLATE_DIRS: TEMPLATE_DIRS = TEMPLATE_DIRS+(template_dir,) static_files_dir = os.path.join(PLUGINS_DIR, '%s/static/' % item) if os.path.isdir(static_files_dir): if static_files_dir not in STATICFILES_DIRS: STATICFILES_DIRS = STATICFILES_DIRS + (static_files_dir,) 

Cualquier ayuda será apreciada. Gracias de antemano.

SOLUCIÓN:

EDIT: Así que lo que hice son los siguientes:

Incluyo dos módulos como este:

 from django.conf import settings from django.utils.importlib import import_module 

Y luego en root urls.py agrego el siguiente código:

 def prettify(app): return app.rsplit('.', 1)[1] for app in INSTALLED_APPS: try: _module = import_module('%s.urls' % app) except: pass else: if 'eats.plugins' in app: urlpatterns += patterns('', url(r'^plugins/%s/' % prettify(app), include('%s.urls' % app)) ) 

Muchas gracias @Yuka. Gracias. Gracias. Gracias. Gracias … Tú haces mi día.

Lo que querrás es algo como esto:

 from django.utils.importlib import import_module for app in settings.INSTALLED_APPS: try: mod = import_module('%s.urls' % app) # possibly cleanup the after the imported module? # might fuss up the `include(...)` or leave a polluted namespace except: # cleanup after module import if fails, # maybe you can let the `include(...)` report failures pass else: urlpatterns += patterns('', url(r'^%s/' % slugify(app), include('%s.urls' % app) ) 

También querrá robar e implementar su propio slugify desde la plantilla de django o utils (¿no estoy muy seguro de dónde vive en estos días?) Y modificarlo ligeramente para eliminar cualquier “punto” y otro espacio de nombre inútil que no tenga desea en tu ‘url’, por ejemplo, es posible que no quieras que tus urls se vean así: ‘example.com/plugin.some_plugin_appname/’ pero como example.com/nice_looking_appname/

Puede que incluso no quieras que se le asigne un nombre de forma automática después de todo, y en lugar de eso, hagas un “ajuste” configurable en el módulo de “ajustes” de tus complementos o algo así:

 # plugin settings conf url_namespace = 'my_nice_plugin_url/' # root urls.py: url(r'^%s/' % mod.url_namespace, include(...)) # or: url(r'^%s/' % app.settings.url_namespace, inc.. 

Probablemente entiendas lo esencial.

Saludos cordiales,

¿Has probado algo como:

 for app in INSTALLED_APPS: # You'll want to check that you can import the urls of that app here urlpatterns += patterns('', url(r'^%s/' % app, include('%s.urls' % app) ) )