Posts Tagged ‘ google app engine

Django 1.2.3 + Google App Engine

Debido al proyecto Georemidme, me he tenido que empapar del funcionamiento de Google App Engine, algo que es relativamente simple.

Google da soporte para Django 0.9.6 y nosotros queremos usar la versión 1.2.3 (o cualquier otra), ¿cómo lo hacemos?

Antes, quiero hacer unas aclaraciones respecto a los modelos en Google App Engine; Google da soporte para cualquier módulo Python que corra en Python 2.5, pero el almacenamiento de los modelos no es una base de datos clásica relacional si no que utiliza sus propios sistemas.

Como consecuencia no podremos utilizar los modelos nativos Django (si se podría, utilizando parches para que los emulen), así que las aplicaciones y middlewares incluidas con Django que utilizan modelos no las podemos usar.

Nosotros hemos preferido no utilizar ningún parche de modo que tengamos que aprender el API de almacenamiento de Google 🙂

Hechas estas aclaraciones vamos a pasar a describir paso por paso como utilizar nuestra propia versión de Django con Google App Engine.

En el directorio raiz del SDK de GAE creamos nuestro proyecto Django. Como he comentado, tendremos que desactivar todas las aplicaciones y middleware que utilicen el modelo de Django (auth, admin, sessions, messages, etc).

En el directorio del proyecto, creamos el siguiente fichero llamado main.py:

import logging, os, sys
 
# Google App Engine imports.
from google.appengine.ext.webapp import util
 
# Remove the standard version of Django.
for k in [k for k in sys.modules if k.startswith('django')]:
  del sys.modules[k]
 
# Force sys.path to have our own directory first, in case we want to import
# from it.
sys.path.insert(0, 'django.zip')
sys.path.insert(0,os.path.abspath(os.path.dirname(__file__)))
 
# Must set this env var *before* importing any part of Django
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
 
import django
 
import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcher
 
def log_exception(*args, **kwds):
 logging.exception('Exception in request:')
 
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()

Como vemos, el fichero incluye un tal django.zip, esta será nuestra versión de Django comprimida que estará en el mismo directorio, y sí, hay una biblioteca que permite cargar módulos comprimidos. Supongo que para importar cualquier módulo será igual.

El fichero app.yaml podría ser:

application: appquesea
version: 1
runtime: python
api_version: 1

handlers:
- url: /static
  static_dir: static

- url: /.*
  script: main.py

Donde static/ serán los contenidos estáticos.

Por último señalar que me ha estado dando problemas nombrar los módulos con nombredeaplicacion.loquesea, que si os da problemas quitad el nombredeaplicacion.

Un gran número de parejas jóvenes que se enfrentan a varios problemas de salud, tales personas pueden comprar medicamentos en línea de investigación sin orden. Antibióticos de penicilina muy populares que combaten las bacterias. Estos remedios no tratan una infección viral por ejemplo un resfriado común. Vamos a hablar de numerosas drogas existe. Kamagra es un remedio usado para tratar varias quejas. ¿Qué sabes sobre “Comprar Kamagra Oral Jelly“? Actualmente muchos hombres buscan la frase exacta “comprar kamagra 100mg” en Internet. (Leer más “Kamagra Oral Jelly“). Debido a que algunos de los problemas sexuales son emergencias médicas, es bueno conocer los síntomas. Ciertas personas que usan este medicamento generalmente no tienen efectos secundarios graves Kamagra. El farmacéutico necesita resolver qué dosis es la mejor en su caso. Si el medicamento se usa según sea necesario, es poco probable que esté en un horario de dosificación.