Google App Engine:データストアに保存した CSS を利用する。

スタートガイドには、外部スタイルシートを静的ファイルで利用する方法が紹介されていました。けれども、スタイルシートを頻繁に変更する場合、いちいち Google App Engine にアップロードしなければならないのは面倒ではないでしょうか?

そこで、スタイルシートの内容をデータストアに保存しておき、これを呼び出せばいいのではないかと考え、試してみました。

まず、app.yaml

handlers:
- url: /src/.*
  script: src.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'
   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([('/file/.*', GetFile)], debug=True)

def main():
  run_wsgi_app(application)

if __name__ == "__main__":
  main()

Entry は、データストアの項目を定義しています。
aim は、普通の記事では、それが記事である旨の印(例えば、"article")を入れる予定です。そして、スタイルシートなどは、それ以外(例えば、"file")を入れることで区別します。
title は、普通の記事では記事の表題とし、スタイルシートはファイル名(例えば"test.css")を入れます。
content は、普通の記事では記事の内容とし、スタイルシートではスタイルシートの内容を入れます(例えば「h2{color:#cc0000}」など)。

/src/?title=test.css へアクセスがあった時には、パラメータ title の値を読み取って、該当するテキストをデータストアから探して出力します。

出力される記事のテンプレートファイルに、次のように記述したところ、ちゃんとスタイルシートが効いていました。

<link
 type="text/css"
 rel="stylesheet"
 href="/src/?title=test.css" 
/>