みなさん、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つだけです。簡単ですよね。
- このアプリをGAEデプロイ(設置)
- /adminディレクトリにアクセスし、GAEの管理者アカウントでログイン
- ファイルのアップロードフォームが表示されるので、ZIPのアーカイブをアップロード
注意事項
以下の点にご注意ください。
- ZIPでファイルを固めるときに、アップロードしたいフォルダの中のファイルを全選択してZIP化してください。
アップロードしたフォルダをZIP圧縮すると余分な階層ができてしまいます。 - 拡張子が、html, htm, css, js, png, jpg, jpeg, gif 以外のファイルはサポートしていません。
- PHPなどのサーバサイドのスクリプト言語も動作しません。
- 対応文字コードはUTF-8だけです
- ディレクトリリスティングはサポートしていません
- .htaccessはサポートしていません
サンプル環境
こちらで公開しています。
今後の方針
GAEのアカウントをとったり、アプリをデプロイするのは、初心者には結構難しい作業だと思います。今回作成したシステムを改良して1箇所にデプロイした環境を、みんなで共用できるようにしたいなーと思ってます。