2010-06-24 19 views
1

Dans mon projet Django, mon module url.py ressemble à ceci:Django url.py sans noms de méthode

urlpatterns = patterns('', 
    (r'^$', 'web.views.home.index'), 
    (r'^home/index', 'web.views.home.index'), 
    (r'^home/login', 'web.views.home.login'), 
    (r'^home/logout', 'web.views.home.logout'), 
    (r'^home/register', 'web.views.home.register'), 
) 

est-il un moyen de simplifier pour que je ne ai pas besoin d'une entrée pour chaque méthode à mon avis? Quelque chose comme ça serait bien:

urlpatterns = patterns('', 
    (r'^$', 'web.views.home.index'), 
    (r'^home/(?<method_name>.*)', 'web.views.home.(?P=method_name)'), 
) 

MISE À JOUR

Maintenant que je sais au moins une façon de faire, est ce genre de chose recommandée? Ou y a-t-il une bonne raison de créer explicitement un mapping pour chaque méthode individuelle?

Répondre

2

peut être quelque chose comme ça:

import web.views.home as views_list 
urlpatterns = patterns('', 
    (r'^$', 'web.views.home.index'), 
    *[(r'^home/%s' % i, 'web.views.home.%s' % i) for i in dir(views_list)] 
) 
+0

Nice! Je suppose que pour être sûr, je devrais vérifier pour une sorte de décorateur personnalisé (@public ou @web_method ou quelque chose). – MikeWyatt

+0

'dir (amodule)' contiendra des noms spéciaux (avec double trait de soulignement avant et après) tels que '__file__',' __name__' etc - vous voulez certainement éviter _those _! -). Un simple décorateur peut construire explicitement la liste des vues intéressantes - recommandé. –

3

Vous pouvez utiliser une vue basée sur la classe avec une méthode répartiteur:

class MyView(object): 
    def __call__(self, method_name): 
     if hasattr(self, method_name): 
      return getattr(self, method_name)() 


    def index(self): 
     ...etc... 

et votre urls.py ressemblerait à ceci:

from web.views import MyView 
urlpatterns = patterns('', 
    (r'^$', 'web.views.home.index'), 
    (r'^home/(?<method_name>.*)', MyView()), 
)