2009-06-19 2 views
5

Есть ли преимущество в передаче строки в ваших URL-адресах против экземпляра функции? Похоже, что может быть оптимизированным, чтобы на самом деле не загружать функцию до тех пор, пока она не понадобится, но действительно ли это так?django передать строку или экземпляр в urls.py?

from django.conf.urls.defaults import * 
from myapp.views import myView 

urlpatterns = patterns('', 
    # as a string 
    url(r'^as-string/$', "myapp.views.myView"), 

    # Uploading photos 
    url(r'^as-instance/$', myView), 

) 

редактировать: Если это правда, что он не импортирует, пока они не нужны, то это будет оптимизация памяти, но несуществующие функции и другие ошибки не будут повышены, пока вы на самом деле попробуйте посетить URL.

Конечно, это не проблема, если вы пишете тесты, хотя;)

+0

Извините, но я ожидаю, что myView будет функцией, а не экземпляром. ну fonction является объектом в python, но ... – dzen

ответ

8

Главное преимущество заключается в том, что, когда вы работаете с фактическим вызываемым объектом, вы можете делать такие вещи, как применять декораторы к нему в URLConf. Таким образом, вы можете делать такие вещи, как:

from django.conf.urls.defaults import * 
from django.contrib.auth.decorators import login_required 

from some_module import some_view 

urlpatterns = patterns('', 
         (r'^some_url/$', some_view), 
         (r'^some_other_url/$', login_required(some_view))) 

т.д.

Это позволяет иметь декораторов, которые применяются только к виду, когда вы конкретно хотите их, а не декорирования в файле просмотров, а затем необходимости живите с ним, всегда применяя этот декоратор.

+0

Мне нравится этот трюк, с которого мне придется это сделать сейчас: – Jiaaro

1

просматривал source к RegexURLPattern (что defaults.url использует под одеялом), подтверждает, что импорт происходит только тогда, когда и в случае необходимости, и поэтому ваши идеи верны: это небольшая оптимизация, но требует тщательных испытаний!

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