News

Cron my gae account

At this time, cron is not available on GAE. But in the future I see well a new kind of yaml entry which will permit to use a cron system ;-)

Currently, it's possible to make a cron job, by fetching an url of its own account, by using webcron.org. I test it since some days, and it works well with my GAE account. Don't expect to make heavy job, due to gae limitations. But for simple job ; it works well.

Edit 23/05/08 : It seems that webcron has got some real trouble since some days. I found onlinecron which works like a charm.

UtilityMill to do what is impossible to do on GAE

UtilityMill is another powerfull python web based service which allow you to create python web services, by providing a lot of powered python librairies, including PIL !

The interesting thing is that it provides restull api. So it can be possible to do some things which are not available on gae, by using the gae fetch function. It's better than nothing.

This one provides a thumbnailer service. I hadn't done an implementation of this one. But here is a stupid implementation for using the rot13 web service of UtilityMill:

from google.appengine.api import urlfetch
from xml.etree import ElementTree
import urllib

def getRot13(txt):
    service="rot13"
    version=13
    url="http://utilitymill.com/api/xml/utility/%s/%d/run?textIn=%s" % (
                service, version, urllib.quote_plus(txt) )

    result = urlfetch.fetch(url)
    if result.status_code==200:
        dom=ElementTree.fromstring(result.content)
        return dom.find("output").text
    else:
        return None

print getRot13("Hello from rot13 !")

ZipMe : Download sources of your GAE website, as a zip file

This is just a simple app script, called "zipme", you must put into your account, at the root of the folder. Just add this lines in your app.yaml :

- url: /zipme
  script: zipme.py

And with your favorite browser, go to your gae account http:// your_host/zipme, and it will download all your source in a zip file. Of course, you'll need to be logged in as an admin, to be able to get the download.

This source is released in the Public domain :

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
##########################################################################
ZipMe : GAE Content Downloader
##########################################################################
Just add this lines in your app.yaml :

- url: /zipme
  script: zipme.py

##########################################################################
"""                                                             # manatlan

from google.appengine.ext import webapp
from google.appengine.api import users

import wsgiref.handlers
import zipfile
import os,re,sys,stat
from cStringIO import StringIO

def createZip(path):

    def walktree (top = ".", depthfirst = True):
        names = os.listdir(top)
        if not depthfirst:
            yield top, names
        for name in names:
            try:
                st = os.lstat(os.path.join(top, name))
            except os.error:
                continue
            if stat.S_ISDIR(st.st_mode):
                for (newtop, children) in walktree (os.path.join(top, name),
                                                    depthfirst):
                    yield newtop, children
        if depthfirst:
            yield top, names

    list=[]
    for (basepath, children) in walktree(path,False):
          for child in children:
              f=os.path.join(basepath,child)
              if os.path.isfile(f):
                    f = f.encode(sys.getfilesystemencoding())
                    list.append( f )

    f=StringIO()
    file = zipfile.ZipFile(f, "w")
    for fname in list:
        nfname=os.path.join(os.path.basename(path),fname[len(path)+1:])
        file.write(fname, nfname , zipfile.ZIP_DEFLATED)
    file.close()

    f.seek(0)
    return f


class ZipMaker(webapp.RequestHandler):
    def get(self):
        if users.is_current_user_admin():
            folder = os.path.dirname(__file__)
            self.response.headers['Content-Type'] = 'application/zip'
            self.response.headers['Content-Disposition'] = \
                    'attachment; filename="%s.zip"' % os.path.basename(folder)
            fid=createZip(folder)
            while True:
                buf=fid.read(2048)
                if buf=="": break
                self.response.out.write(buf)
            fid.close()
        else:
            self.response.headers['Content-Type'] = 'text/html'
            self.response.out.write("<a href=\"%s\">You must be admin</a>." %
                                    users.create_login_url("/zipme"))

def main():
    application = webapp.WSGIApplication(
                                       [('/zipme', ZipMaker)],
                                       debug=False)
    wsgiref.handlers.CGIHandler().run(application)

if __name__ == "__main__":
    main()

Note :

  • it seems it's not able to zip static content (which seems to layout somewhere else)

Gae openid sample

Here is an example of a GAE OpenID example, browse the source under trunk :

http://code.google.com/p/google-app-engine-samples/

RSS Python Powered Get Ubuntu
©opyleft 2008-2026 - manatlan contact