Django class based views com lazy loading

Vejamos um pequeno exemplo de uso do class based views no Django:

# views.py
from django.views.generic import ListView
from books.models import Publisher

class PublisherList(ListView):
    model = Publisher
# urls.py
from django.conf.urls import patterns, url
from books.views import PublisherList

urlpatterns = patterns('',
    url(r'^publishers/$', PublisherList.as_view()),
)

O problema desse código é que você precisa importar o PublisherList no urls.py, para pequenos projetos isso não é problema, mas se o projeto for muito grande o tempo de carregamento do urls.py será comprometido.

Usando o paradigma tradicional de views (uma função que recebe request e retorna um HttpResponse) podemos carregar essa view apenas quando necessário, isso é chamado de lazy loading, muito melhor para grandes projetos, pois a importação de todas as views no urls.py é desnecessária.

Podemos resolver isso de uma maneira muito fácil:

# views.py
from django.views.generic import ListView
from books.models import Publisher

class PublisherList(ListView):
    model = Publisher

publisher_list = PublisherList.as_view()
# urls.py
from django.conf.urls import patterns, url

urlpatterns = patterns('',
    url(r'^publishers/$', 'myapp.views.publisher_list'),
)
Anúncios

2 comentários sobre “Django class based views com lazy loading

  1. Antes,
    In [2]: %timeit reload(urls)
    1000 loops, best of 3: 247 us per loop

    Depois,
    In [2]: %timeit reload(urls)
    1000 loops, best of 3: 185 us per loop

    Allison, fiz alguns testes e é possível ganhar de 30% a 40%, usando esse método.

    Abaixo tem um Hackzinho para criar referência automaticamente.
    Só colocar no final das views ou colocar em um modulo e importar no fim.
    Ele irá criar uma referência utilizando o nome da View em minusculo.

    “””
    # Hack to optmize urls
    from django.views.generic.base import View

    is_cbview = lambda view: isinstance(view, type) and issubclass(view, View)
    views = filter(is_cbview, locals().values())

    for view in views:
    if view.__module__ == __name__:
    view_name = view.__name__.lower()
    locals()[view_name] = view.as_view()
    “””

    Parabéns pelo Blog!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s