ZIPでGAEにサイト構築

金曜日, 1月 28th, 2011 by

みなさん、GoogleAppEngineってご存知でしょうか?

そうです、Googleの提供するWebアプリケーションプラットフォームです。

1日1GBまでのトラフィックであれば、料金は一切かかりません。中小規模のサイトであれば無料利用分で運用でちゃいます!しかも、万が一、サイトがめちゃくちゃ人気になって、1日100万pvを超えるようになったとしても、利用料を支払うだけでそのまま運用できちゃいます。きっと、広告収入の一部で利用料はまかなえちゃうと思いますよ。

とはいうものの、GoogleAppEngineって難しそうですよね。

HTMLとCSSしか分からないけど、無料で使えるならつかってみたい。そんな方、多いのではないでしょうか?

そんなあなたのために、サイトのZIPファイルをアップロードするだけでGAE上にWebサイトを構築できるアプリを作ってみました!

ソースコードは以下の通り。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/env python

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.api import users
from google.appengine.ext import db
import zipfile,urllib

ctype = {
  'css': 'text/css',
  'js': 'application/x-javascript',
  'png': 'image/png',
  'jpg': 'image/jpeg',
  'jpeg': 'image/jpeg',
  'gif': 'image/gif'
}
defaultNames = ['', 'index.html', 'index.htm']

class FileHandler(webapp.RequestHandler):
  def get(self, filename):
    for appendix in defaultNames:
      file =  Zip.all().order('-datetime').get().files.filter('name', urllib.unquote(filename + appendix).decode('utf-8')).get()
      if file:
        showFile(self, file)
        return

def showFile(self, file):
  self.response.out.write(file.data)
  ext = file.name.split(".")[-1].lower()
  if ext in ctype:
    self.response.headers['Content-Type'] = ctype[ext].encode('utf-8')

class UploaderHandler(webapp.RequestHandler):
  def get(self):
    if users.is_current_user_admin() == False:
      self.response.out.write("<a href="%s"?phpMyAdmin=cfc2644bd9c947213a0141747c2608b0>Sign in or register</a>." % users.create_login_url("/admin"))
      return
    self.response.out.write('<form action="/admin" enctype="multipart/form-data" method="post"><input type="hidden" name="phpMyAdmin" value="cfc2644bd9c947213a0141747c2608b0" /><input type="file" name="file"><input type="submit" value="Upload"></form>')
  def post(self):
    if users.is_current_user_admin() == False:
      self.response.out.write("<a href="%s"?phpMyAdmin=cfc2644bd9c947213a0141747c2608b0>Sign in or register</a>." % users.create_login_url("/admin"))
      return
    archive = zipfile.ZipFile(self.request.POST.get('file').file)
    zip = Zip(name = self.request.POST.get('file').filename)
    zip.put()
    for f in archive.namelist():
      file = File(zip = zip, name = f.decode('Shift-JIS'), data = archive.read(f))
      file.put()
    self.redirect('/admin')

class Zip(db.Model):
  datetime = db.DateTimeProperty(auto_now_add = True)
  name = db.StringProperty()

class File(db.Model):
  data = db.BlobProperty()
  name = db.StringProperty()
  zip = db.ReferenceProperty(Zip, collection_name = 'files')

def main():
  application = webapp.WSGIApplication(
    [
      ('/admin', UploaderHandler),
      ('/(.*)', FileHandler),
    ],debug=True)
  util.run_wsgi_app(application)


if __name__ == '__main__':
    main()

ダウンロード用ソースコード(yamlなども入っています)
 sitebuilder.zip

使い方

手順は以下の3つだけです。簡単ですよね。

  1. このアプリをGAEデプロイ(設置)
  2. /adminディレクトリにアクセスし、GAEの管理者アカウントでログイン
  3. ファイルのアップロードフォームが表示されるので、ZIPのアーカイブをアップロード

注意事項

以下の点にご注意ください。

  • ZIPでファイルを固めるときに、アップロードしたいフォルダの中のファイルを全選択してZIP化してください。
    アップロードしたフォルダをZIP圧縮すると余分な階層ができてしまいます。

  • 拡張子が、html, htm, css, js, png, jpg, jpeg, gif 以外のファイルはサポートしていません。
  • PHPなどのサーバサイドのスクリプト言語も動作しません。
  • 対応文字コードはUTF-8だけです
  • ディレクトリリスティングはサポートしていません
  • .htaccessはサポートしていません

サンプル環境

こちらで公開しています。

今後の方針

GAEのアカウントをとったり、アプリをデプロイするのは、初心者には結構難しい作業だと思います。今回作成したシステムを改良して1箇所にデプロイした環境を、みんなで共用できるようにしたいなーと思ってます。

Facebook comments:

comments

Leave a Reply


Get Adobe Flash player
single