2012-03-29 3 views
4

Ich entwickle eine Django-Anwendung, die dynamische Module (zur Laufzeit) laden muss. Jetzt bin ich in der Lage, "Plugins" (vom Client-Browser zum Server) hochzuladen und das Plugin-Modell in der Datenbank usw. zu registrieren. Aber ich brauche einen Weg, um die URL-Muster für jedes Plugin zu handhaben. Momentan habe ich eine Funktion im "Kern" der Webapp geschrieben, die ein Modell registriert und (theoretisch) die URL-Muster des hochgeladenen Plugins zur webapp urls.py hinzufügt. Diese Funktion ist:Modifizieren von URL-Mustern zur Laufzeit in Django

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'))) 

Plugins zu „media/tmp“ in tgz-Format hochgeladen werden und dann extrahiert, um „Medien/plugins /“ wo ist der Codename des Plug-Ins, und die Benutzer hochgeladen Plugins verwaltet durch " project.plugins ".

Alle Plugins Logik funktioniert gut, aber wenn ich versuche, die hochgeladene plugin urls.py Datei in die Webapp (project.plugins.urls) aufzunehmen, hat es keine Wirkung. Ich habe den Wert von "project.plugins.urls.urlpatterns" gedruckt und es wird nicht nach "urlpatterns + = pat ...." geändert.

Gibt es eine Möglichkeit zu tun, was ich brauche?

Mit freundlichen Grüßen

Antwort

3

Das Problem Sie konfrontiert, ist, dass urlpatternsurl.py Datei in Ihren Projekten definiert und die urlpatterns in Ihrer register_plugin Datei sind verschiedene Variablen definiert. Sie sind lokal für das Modul. Stellen Sie sich folgendes Szenario vor:

#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? 

Sie dürfen das natürlich nicht tun. Was Sie wahrscheinlich tun müssen, ist das Original urls.py zu versuchen, URLs in Ihrem Plugins-Ordner zu entdecken.

# 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 

Leider wird der Webserver müssen den Prozess für diesen Code recyceln zu laufen, so das Hochladen von Plugins wird nur in Kraft treten, wenn das passiert.

1

Die Funktion, die urls.py und urls.py ändert, gehört demselben Modul an. Ich habe es gelöst, indem ein "leeres Muster" und fügte hinzu:

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

Nun heißt es:

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/> 

Aber hat gesagt, Sie, es wirksam nicht sofort:/

Ich habe die Anwendung neu gestartet, ohne * .pyc-Dateien zu löschen, aber Änderungen wurden nicht wirksam. Was ist das Problem?

PD: Das Plugin urls.py Datei enthält:

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

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

Vielen Dank für Ihre Antwort

Mit freundlichen Grüßen