El modelo debe definirse así:
from google.appengine.ext import db
from google.appengine.ext import blobstore
class MiModelo(db.Model):
....#algunos campos
archivo=blobstore.BlobReferenceProperty() #aqui se registrara la llave del archivo
....#otros campos
En la clase que maneja las peticiones se liga la url estática definida en con el resto de las peticiones con la URL que genera blobstore para la sesion esta se registra en una variable que se pondrá dentro del formulario html de forma dinámica.
from google.appengine.ext import webapp, db
from google.appengine.ext import blobstore
from google.appengine.ext.webapp import blobstore_handlers
class MiClase(webapp.RequestHandler):
pathtemplate = os.path.join(path, 'el_template.html')
template_values ={ #en esta variable se liga la URL con la direccion de la sesion
"upload_url": blobstore.create_upload_url('/upload'),
}
self.response.out.write(template.render(pathtemplate, template_values))
Este sería el código del formulario en el template, ver que en el campo action se asigna el valor de la variable upload_url
La clase que maneja el blob sería la siguiente, donde el blob es almacenado al momento de entrar a la clase y solo se registra la llave para poder instanciarlo despues.
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
upload_files = self.get_uploads('file')
blob_info = upload_files[0]
miclase=MiClase()
miclase.archivo=blob_info.key()
miclase.put()
self.redirect('../OtraPagina' )
