News
Home Home Contact us Contact

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