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>