Google App Engine:データストアに保存した JavaScript を利用する。
スタートガイドには、静的ファイルで利用する方法が紹介されていました。けれども、スクリプトを頻繁に変更する場合、いちいち Google App Engine にアップロードしなければならないのは面倒ではないでしょうか?
そこで、スクリプトの内容をデータストアに保存しておき、これを呼び出せばいいのではないかと考え、試してみました。
やり方は前回の記事「Google App Engine:データストアに保存した CSS を利用する。」と同じです。
まず、app.yaml。
handlers: - url: /src/.* script: file.py - url: /.* script: main.py
/src/ へのアクセスは、src.py で受ける設定にします。
次に src.py
import cgi from google.appengine.ext import webapp from google.appengine.ext.webapp.util import run_wsgi_app from google.appengine.ext import db import re class Entry(db.Model): author = db.UserProperty() aim = db.StringProperty() title = db.StringProperty() content = db.TextProperty() tag = db.StringProperty() date = db.DateTimeProperty(auto_now_add=True) class GetFile(webapp.RequestHandler): def get(self): title = self.request.get('title') if re.match(r'\.css',title): contentType='text/css' elif re.match(r'\.js',title): contentType='application/x-javascript' else: contentType='text/plain' entries = Entry.all() entry = entries.filter("title =",title)[0] self.response.headers['Content-Type'] = contentType self.response.out.write(entry.content) application = webapp.WSGIApplication([('/src/.*', GetFile)], debug=True) def main(): run_wsgi_app(application) if __name__ == "__main__": main()
前回の記事「Google App Engine:データストアに保存した CSS を利用する。」のコードに、次の部分を追加しただけです。
elif re.match(r'\.js',title): contentType='application/x-javascript'
Entry は、データストアの項目を定義しています。
aim は、普通の記事では、それが記事である旨の印(例えば、"article")を入れる予定です。そして、スタイルシートなどは、それ以外(例えば、"file")を入れることで区別します。
title は、普通の記事では記事の表題とし、スタイルシートはファイル名(例えば"test.js")を入れます。
content は、普通の記事では記事の内容とし、スタイルシートではスタイルシートの内容を入れます(例えば、「alert('Hello!')」)。
/file/?title=test.js へアクセスがあった時には、パラメータ title の値を読み取って、該当するテキストをデータストアから探して出力します。
出力される記事のテンプレートファイルに、次のように記述したところ、ちゃんとスクリプトが効いていました。
<script type="text/javascript" src="/src/?title=test.js"> </script>