2016-12-27 1 views
1

Я пытаюсь написать некоторый код для динамического импорта приложения «plugin-like» в моем проекте django. Я использую Django 1.10Динамически импортировать url в Django дает объект 'str' не вызываемый

Я подклассы в django.apps.AppConfig класс и использовать его для обозначения плагинов:

from django.apps import AppConfig 
class AutomationAppConfig(AppConfig): 
    def get_url(self): 
     return self.name 

тогда, в моем проекте основного urls.py я добавил этот код после основного «статических» urlpatterns initializazion:

... 

from slae.util import AutomationAppConfig 
from django.apps import apps 

for module in iter(apps.get_app_configs()): 
    if isinstance(module, AutomationAppConfig): 
     url = module.get_url() 
     urlpatterns.append(url(r'^%s/' % url, include('%s.urls' % module.name), name = module.name)) 

, но он дает следующую ошибку, когда сервер (ре) загружает

... 
File "/cygdrive/d/workspaces/non-ide/slae/slae/urls.py", line 47, in <module> 
urlpatterns.append(url(r'^%s/' % url, include('%s.urls' % module.name), name = module.name)) 
TypeError: 'str' object is not callable 

То, что я не понимаю, что с помощью этого кода вместо этого он работает отлично:

from slae.util import AutomationAppConfig 
from . import settings 
from django.utils.module_loading import import_string 
import inspect 

for app in settings.INSTALLED_APPS: 
    try: 
     module = import_string(app) 
    except: 
     pass 
    else: 
     if inspect.isclass(module) and issubclass(module, AutomationAppConfig): 
      urlpatterns.append(url(r'^%s/' % module.name, include('%s.urls' % module.name), name = module.name)) 

Что мне не хватает?

ответ

2

url - это функция, определенная в from django.conf.urls. Однако следующая строка в вашем коде перезаписывает эту переменную и сохраняет там строку.

url = module.get_url() 

изменить эту переменную что-то другое, например:

url_route = module.get_url() 
urlpatterns.append(url(r'^%s/' % url_route, include('%s.urls' % module.name), name = module.name)) 
+0

спасибо! Я был уверен, что это было тривиально, я просто не мог этого видеть ... Я чувствую себя глупым XD – Antiphon0x

Смежные вопросы