検索するデータの登録プログラム


app.yaml

先頭のApplication ID は、各自GAE登録時に設定した Application Identifier を設定して下さい。
最後の message.py が今回のpython プログラムです。

index.html

% for message in msbg %}
から
{% endfor %}で、python プログラムから受け渡されたデータ N件分繰り返して html の生成をしています。

{{ ○○ }} はpython プログラムから渡されたデータ名(○○)になります。

message.py

2行目 #! -*- coding:utf-8 -*- は、# -*- coding:utf-8 -*- でも動きます。
(どちらが正しいか不明)

実際のデータを登録するデータ定義
class MessageBord (db.Model):
  owner = db.StringProperty(multiline=True)
  content = db.StringProperty(multiline=True)
  createDT = db.StringProperty(multiline=True)

  owner  :登録した登録者名を保存する領域(画面入力)
  content :検索対象となる文字列を保存する領域(画面入力)
  createDT:登録日時を設定(自動設定も可能ですが、ここではあえて日時を設定しています)


索引データを登録するデータ定義
class MessIndex (db.Model):
  seldata = db.StringProperty(multiline=True)
  site = db.StringProperty()

  seldata :N-GRAM で設定するキーとなる文字列を保存(検索の際のキーとなる)
  site  :MessageBordに登録されたデータの実際のキー(登録時に自動設定されるキー値)

--------------------------------------------------------------------------------------------
MesSave のClass

Def post(self)

  画面から "post" で起動された場合に動く処理

messagebord.content = re.sub(" ", "", self.request.get('content'))
nichiji = datetime.datetime.now() + datetime.timedelta(hours=9)
messagebord.createDT = nichiji.strftime("%Y/%m/%d %H:%M:%S")

  re.sub(" ", "", self.request.get('content'))で、空白データを削除しています。
  nichiji = datetime.datetime.now() + datetime.timedelta(hours=9)
  nichiji.strftime("%Y/%m/%d %H:%M:%S")で、現在日時を取得し、9時間進めてから編集しています。
  本来は処理している地域により編集すべきでしょうが、地域と時間差は日本固定にしています。


messagebord.put()

  ここでMessageBord にデータを書き出しています。


keysite = messagebord.key()
wk_cnt = 0
wk_area = messagebord.content
while wk_cnt < len(messagebord.content) :
  messindex = MessIndex()
  messindex.seldata = wk_area[wk_cnt:]
  messindex.site = str(keysite)
  messindex.put()
  wk_cnt += 1

  messagebord.put() で書き出した際のキーを keysite に設定します。
  messindex = MessIndex() で出力する MessIndex の名前(messindex)を定義します。
  ここで毎回定義しないと、最後の1件しか出力されません。
  出力するキー部分(seldata)に、画面入力したデータ(content)の1桁目から最後まで、
  2桁目から最後までと、whileの数だけ(長さ分だけ)設定します。
  messindex.put() で、索引データの出力になります。


--------------------------------------------------------------------------------------------
MainProc のClass

messagebord_query = MessageBord.all().order('-createDT')
msbd = messagebord_query.fetch(10)

  db.Gqlquery と対をなすアクセスで、createDT の降順に全件取得する
  とはいいながら、先頭の10件のみをfetch(実取得)し、msbd のリストに入れる
  fetch(10) を取れば、全件表示になります。


template_values = { 'msbd': msbd }

  画面(テンプレート)に取得したデータリスト msbd(右側) を画面系のhtml に
  msbd(左側)という名前で渡す。


path = os.path.join(os.path.dirname(__file__), 'index.html')
self.response.out.write(template.render(path, template_values))

  ここで画面系の出力を行う、テンプレートを使用し、index.html を起動


--------------------------------------------------------------------------------------------
application = webapp.WSGIApplication([('/', MainProc),('/save', MesSave)],debug=True)

  起動が、/ の場合(最初)は、MainProcを実施する。
  起動が、/save の場合(画面から)は、MesSaveを実施する。


--------------------------------------------------------------------------------------------
def main():
  run_wsgi_app(application)
if __name__ == "__main__":
  main()

  if __name__ == "__main__": が最初に動く箇所で、main を呼出す
  main の内容はよく判らない(笑)python の標準?