2009-06-19 14 views
5

¿Hay algún beneficio al pasar una cadena en sus patrones de URL frente a una instancia de función? Parece que podría estar optimizado para no cargar la función hasta que se necesite, pero ¿es esto cierto?django: ¿pasar una cadena o una instancia en 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), 

) 

edición: Si bien es cierto que no importa hasta que se necesiten, entonces sería una optimización de la memoria, sino que funciona inexistente, y otros errores que no se levantaría hasta que realmente intenta visitar la url.

Por supuesto que no es un problema si se escribe pruebas aunque;)

+0

lo siento pero espero que myView sea una función, no una instancia. Bueno, una función es un objeto en Python, pero ... – dzen

Respuesta

8

El beneficio principal es que cuando trabajas con el objeto real que puedes llamar puedes hacer cosas como aplicarle decoradores en el URLConf. Por lo que puede hacer cosas como:

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

etc.

Esto le permite tener decoradores que sólo se aplican a una vista cuando se desea específicamente que, en lugar de la decoración en el archivo de puntos de vista y luego tener que vive con eso siempre teniendo ese decorador aplicado.

+0

Me gusta ese truco Voy a tener que hacer eso a partir de ahora :) – Jiaaro

1

leer los source a RegexURLPattern (que es lo defaults.url está utilizando bajo las sábanas) confirma que la importación sólo ocurre cuando y si es necesario, y entonces tus ideas son correctas: ¡es una ligera optimización pero requiere pruebas exhaustivas!

Cuestiones relacionadas