2012-03-29 41 views
4

我正在开发一个需要加载动态模块(运行时)的Django应用程序。现在我可以上传(从客户端浏览器到服务器)“插件”,并在数据库中注册插件模型等,但我需要一种方法来处理每个插件的urlpatterns。目前,我已经在注册模型的webapp的“核心”中编写了一个函数,并且(理论上)通过包含它将上传的插件的urlpatterns添加到webapp urls.py中。这个函数是:在Django运行时修改urlpatterns

def register_plugin_model(model,codename): 
# Standard syncdb expects models to be in reliable locations, 
# so dynamic models need to bypass django.core.management.syncdb. 
# On the plus side, this allows individual models to be installed 
# without installing the entire project structure. 
# On the other hand, this means that things like relationships and 
# indexes will have to be handled manually. 
# This installs only the basic table definition. 

if model is not None: 
    style = color.no_style() 
    cursor = connection.cursor() 
    tables = connection.introspection.table_names() 
    seen_models = connection.introspection.installed_models(tables) 
    statements,trsh = connection.creation.sql_create_model(model, style, seen_models) 
    for sql in statements: 
     cursor.execute(sql) 

# add urlpatterns 
from django.conf.urls.defaults import patterns, url,include 
from project.plugins.urls import urlpatterns 
urlpatterns += patterns(url(r'^' + codename + '/' , include ('media.plugins.' + codename + '.urls'))) 

插件上传到在TGZ格式“媒体的/ tmp”,然后萃取到“介质/插件/”,其中是插件的代号,并且用户上传的插件由管理“ project.plugins”。

所有插件逻辑工作正常,但是当我尝试将上传的插件urls.py文件包含到webapp(project.plugins.urls)时,它不起作用。我已经打印了“project.plugins.urls.urlpatterns”的值,并且在“urlpatterns + = pat ....”之后没有修改。

有什么办法可以做我需要的吗?

问候

回答

3

你面临的问题,是urlpatterns在项目定义url.py文件,并在你的register_plugin文件中定义的urlpatterns是不同的变量。它们是本地模块。想象一下以下情形:

#math.py 
pi = 3.14 

#some_nasty_module.py 
from math import pi 
pi = 'for_teh_luls' 

#your_module.py 
from math import pi 
pi * 2 
>>> 'for_teh_lulsfor_teh_luls' 
# wtf? 

你显然不能做到这一点。你可能需要做的是询问原始urls.py尝试发现插件文件夹中的URL。

# urls.py 
urlpatterns += (...) 

def load_plugin_urls(): 
    for module in get_plugin_modules(): 
     try: 
      from module.urls import urlpatterns as u 
      urlpatterns += u 
     except: 
      pass 

不幸的是,Web服务器将需要回收的过程,这个代码运行,所以插件上传才会生效一旦出现这种情况。

1

修改urls.py和urls.py的函数属于同一个模块。我已通过添加一个 “空模式” 解决了这个问题:

urlpatterns += patterns('',url(r'^' + codename + '/' , include ('media.plugins.' + codename + '.urls'))) 

现在,它说:

BEFORE: 
<RegexURLPattern plugins ^$> 
<RegexURLPattern plugin_new ^new/$> 
<RegexURLPattern plugin_profile ^profile/(?P<plugin>\w+)$> 
AFTER 
<RegexURLPattern plugins ^$> 
<RegexURLPattern plugin_new ^new/$> 
<RegexURLPattern plugin_profile ^profile/(?P<plugin>\w+)$> 
<RegexURLResolver media.plugins.sampleplugin.urls (None:None) ^sampleplugin/> 

但你说的,它不生效瞬间:/

我已重新启动应用程序而不删除* .pyc文件,但更改未生效。有什么问题?

PD:插件urls.py文件包含:

from django.conf.urls.defaults import patterns, url 
from .views import index_view 

urlpatterns = patterns('' , url(r'^.*' , index_view)) 

感谢您的回复

最好的问候