quinta-feira, 16 de abril de 2009

Django sobre Google App Engine

Saudações a todos!

Esta semana tive a ideia de testar o Google App Engine (GAE), publicando uma pequena aplicação feita por mim sob o django. Fiquei surpreso com a simplicidade de uso do SDK e o suporte fornecidos pelo Google. O GAE compreende uma quantidade razoável de APIs e recursos, inclusive persistência de dados. Outra coisa interessante é o dashboard - página de gerência da aplicação - onde é possível acompanhar o desempenho da aplicação e o consumo de recursos do cluster.

Para publicar minha aplicação, uma vez que eu já havia finalizado-a em "django puro", ou seja, sem o SDK do GAE, precisei fazer algumas adequações no código para garantir compatibilidade com a estrutura do GAE. Nesse momento, o artigo Django on Google App Engine in 13 simple steps[1] (em inglês) de Thomas Brox Røst foi de muita valia. Depois que eu conclui meu projeto descobri uma tradução livre para o português deste mesmo artigo[2].

Dicionário Michaelis Português-Português

Existe uma versão on-line do dicionário da língua portuguesa Michaelis[5]. A aplicação que construi desenvolvendo este artigo recebe uma palavra por parâmetro e realiza uma requisição na página do Michaelis on-line, tratando a resposta desta, de forma que a saída consista apenas do texto plano do conteúdo, eliminando todas as tags html, referentes a formatação, publicidade, etc. Esta aplicação chamei de michaflea[6] - a junção de micha de Michaelis e flea pulga em inglês.

Criando e Publicando uma aplicação no Google App Engine

A primeira coisa que você precisa fazer para iniciar o seu projeto é baixar o SDK[3] fornecido pelo Google.
Estou levando em consideração que você já tenha experiência com Python e Django, e ambos já estejam instalados e funcionando em sua máquina.

Antes de iniciar literalmente a codificação, é interessante que você registre antecipadamente o nome da aplicação, reservando o espaço para publicá-lo. Para isso, você necessitará de uma conta no Google e de uma linha de telefone celular. Siga as intruções no site[4].

Como estou usando o Linux, para instalar o SDK, basta descompactar o pacote.

Crie um diretório para comportar o projeto. No diretório recém-criado, crie um arquivo chamado main.py com o seguinte conteúdo:
# main.py

import os, sys
os.environ["DJANGO_SETTINGS_MODULE"] = "michaflea.settings"
sys.path.append("/home/helder/Projects/GoogleAppEngine/michaflea")

# Google App Engine imports.
from google.appengine.ext.webapp import util

# Force Django to reload its settings.
from django.conf import settings
settings._target = None

import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcher

# Log errors.
#django.dispatch.dispatcher.connect(
# log_exception, django.core.signals.got_request_exception)

# Unregister the rollback event handler.
django.dispatch.dispatcher.disconnect(
django.db._rollback_on_exception,
django.core.signals.got_request_exception)

def main():
# Create a Django application for WSGI.
application = django.core.handlers.wsgi.WSGIHandler()

# Run the WSGI CGI handler with that application.
util.run_wsgi_app(application)

if __name__ == "__main__":
main()
Repare que na linha 4 a variável os.environ["DJANGO_SETTINGS_MODULE"] está recebendo o modulo setings do projeto michaflea. Repare ainda que a linha 5 indica o caminho absoluto da pasta que comporta o projeto.

Crie no mesmo diretório um arquivo chamado app.yaml contendo:
application: michaflea
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
script: main.py
Ainda no mesmo diretório, crie o projeto django:
michaflea$ django-admin.py startproject michaflea

Aqui você irá utilizar toda a sua habilidade de desenvolvedor django.

Uma vez que a aplicação está pronta, podemos agora testá-la usando o GAE. Para isto, faremos uso do utilitário dev_appserver.py que vem na SDK baixada anteriormente.

Para facilitar minha vida, eu criei, dentro do diretório de instalação do SDK, um link simbólico apontando para a pasta do projeto, daí, executei:
helder@helder-laptop:~/Programs/google_appengine$ ./dev_appserver.py michaflea
INFO 2009-04-17 15:54:40,667 appcfg.py] Server: appengine.google.com
INFO 2009-04-17 15:54:40,680 appcfg.py] Checking for updates to the SDK.
WARNING 2009-04-17 15:54:41,279 datastore_file_stub.py] Could not read datastore data from /tmp/dev_appserver.datastore
WARNING 2009-04-17 15:54:41,280 datastore_file_stub.py] Could not read datastore data from /tmp/dev_appserver.datastore.history
INFO 2009-04-17 15:54:41,552 dev_appserver_main.py] Running application michaflea on port 8080: http://localhost:8080
Com isso, pude checar o funcionamento da minha aplicação, acessando-a na URL http://localhost:8080/ .

Uma vez que minha aplicação está devidamente testada e funcionando, pode-se realizar o upload da mesma para o serviço Google App Engine. Para este fim, usa-se outro utilitário que vem com o SDK, o appcfg.py.
helder@helder-laptop:~/Programs/google_appengine$ ./appcfg.py update michaflea

Na primeira vez em que o upload for feito, você terá que informar seu e-mail e sua senha do google.

Pronto! Para ver a aplicação funcionando, acesse http://michaflea.appspot.com/.

Requisitos
  • Ubuntu 8.04 (ou superior)
  • Python 2.5
  • GoogleAppEngine 1.1.5
  • Django 1.0.2

Referências
  • [1] http://thomas.broxrost.com/2008/04/08/django-on-google-app-engine/
  • [2] http://marcioandreyoliveira.blogspot.com/2009/04/13-passos-simples-para-termos-o-django.html
  • [3] http://code.google.com/intl/pt-BR/appengine/downloads.html
  • [4] http://code.google.com/intl/pt-BR/appengine/
  • [5] http://michaelis.uol.com.br/
  • [6] http://michaflea.appspot.com/