segunda-feira, 4 de outubro de 2010

Como usar o Django 1.1 ou 1.0 no Google App Engine sem zipimport

Todo mundo que conhece o django conhece suas facilidades, eu por exemplo adoro o sistema de template, praticamente perfeito. Simples, fácil e funcional (não necessariamente nesta ordem).

Neste artigo é ensinado a importar o django 1.0 apartir de um arquivo zip usando o zipimport. Mas a nossa intenção aqui é fazer o mesmo sem a necessidade do zipimport. Abaixo será mostrado como.

A versão 0.96 (padrão até então no GAE) têm em seu built-in template tags como if, for, etc.. bem limitadas ao contrário da versão 1.1 ou superior.

É preferência de muitos usar {% if x == y %} do que {% ifequal x y %}, os operadores deixam a sintaxe mais perto do padrão usado em outras línguas, além de ser mais bunitinho.

Eu não uso todos os recursos disponibilizados do django no GAE, uso apenas o recurso de template e suas derivações. Já que o GAE nos oferece um framework bem poderoso para trabalhar em cima de sua plataforma.

Ainda uso um método mostrado neste artigo para importar o django por meio do zipimport. Realmente funciona, mas pra mim escravo do dial-up 368kb (django1.2.alpha zipado e sem alguns arquivos) de upload  é realmente uma surra.

Fuxicando aonde não devia ou não, descobri que além do django 0.96 as versões 1.0, 1.1  (só faltou o 1.2 para a alegria geral da nação djangonense) estão disponíveis no GAE no seguinte caminho  /base/python_runtime/python_lib/versions/third_party/, mas como padrão a 0.96 é carregada.

Então vamos por a mão na massa e descobrir como carregar as outras versões. Abaixo o código usado para importar o django 1.1 com seus respectivos comentários. (caso tenha lido o artigo que ensina a importar com zipimport terá mais familiaridade com o código)

import os
import logging

# Verifica se o script está sendo executado no appengine
if os.environ.has_key('SERVER_SOFTWARE') and os.environ['SERVER_SOFTWARE'].lower().startswith('google'):
    
    # desinstala o django atual.
    for k in [k for k in os.sys.modules if k.startswith('django')]:
      del os.sys.modules[k]
    
    # remove os caminhos que dão referência ao django
    for k in [k for k in os.sys.path if k.find('/django-')]:
        del os.sys.path[os.sys.path.index(k)]
        
    # injeta o caminho do django 1.1 no sys.path
    os.sys.path.insert(0, '/base/python_runtime/python_lib/versions/third_party/django-1.1/')
    
    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
    
    # Informativo indicando que os passos acima foram realizados
    logging.info('O módulo do django foi mudado')

Aqui um exemplo de tudo funcionando e seu código fonte.

Att, Gilson Fabiano.

Nenhum comentário:

Postar um comentário