django - передать строку или экземпляр в urls.py? - PullRequest
5 голосов
/ 19 июня 2009

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

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

)

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

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

Ответы [ 2 ]

8 голосов
/ 20 июня 2009

Основным преимуществом является то, что когда вы работаете с реально вызываемым объектом, вы можете делать такие вещи, как применять к нему декораторы в 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)))

и т.д.

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

1 голос
/ 19 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...