备份Google App Engine服务器代码

九月 9th, 2009 发表评论 阅读评论

Google App Engine 不支持直接下载代码文件,所以我们无法直接将服务器上的代码进行备份。如果本地的代码一旦丢失,就很难找回,这点对GAE的用户来说,是相当麻烦的。

好在有人编写了一个工具,用于将GAE站点的代码打包成zip格式并下载

步骤如下:

1.在根目录下根据manatlan的代码建立zipme.py

2.在app.yaml中加入

- url: /zipme
script: zipme.py

3.访问youapp.appspot.com/zipme

zipme.py脚本

#!/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("You must be admin." %

                                    users.create_login_url("/zipme"))

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


if __name__ == "__main__":
    main()

这段代码会通过google的身份认证来判断访问者是否可以下载代码,所以不用担心代码泄漏。不过还是希望Google可以提供代码备份和数据库备份的功能。

                       转自xuming.net

转载请注明来自  云在天边看世界 http://www.tangblog.info
本文永久链接  http://www.tangblog.info/2009/09/9/google-appengine-code-backup.html

分类: Micolog 标签: micolog , code


    “备份Google App Engine服务器代码”共有 1 条留言

  1. zpcat 2010-03-22 at 19:59 |#1 F

    干吗不用google code管理你的代码?
  1. 本文目前尚无任何 trackbacks 和 pingbacks.
在这里留下您的脚印吧……

/static/smilies/icon_question.gif /static/smilies/icon_razz.gif /static/smilies/icon_sad.gif /static/smilies/icon_evil.gif /static/smilies/icon_exclaim.gif /static/smilies/icon_smile.gif /static/smilies/icon_redface.gif /static/smilies/icon_biggrin.gif /static/smilies/icon_surprised.gif /static/smilies/icon_mrgreen.gif /static/smilies/icon_eek.gif /static/smilies/icon_confused.gif /static/smilies/icon_cool.gif /static/smilies/icon_lol.gif /static/smilies/icon_mad.gif /static/smilies/icon_twisted.gif /static/smilies/icon_rolleyes.gif /static/smilies/icon_wink.gif /static/smilies/icon_idea.gif /static/smilies/icon_arrow.gif /static/smilies/icon_neutral.gif /static/smilies/icon_cry.gif

请输入验证码(不区分大小写)