その6 - なにやってるかわかりません。
とりあえずpythonとGoogle AppEngine を一通り使ってみようとしているメモ書きとして書いているこのblogですが、先日先にpythonに手を付けていた知人に見せたところ、「何やってるか全然わからない」と言われてどうしたものかとここ数日考えてました。
すでに違う言語でも、ある程度プログラムを書いている身としては、「それほど難しいことは書いてない」つもりだったんですが、それはやっぱり「つもり」だっただけで複雑なのかな。
まずはこんなことができるんだねーという話から、いくつかプログラムを書いてみて、最終的に他のサービスとの連動とかしたものを作れたらいいなーと漠然と考えてたんですが、なかなか難しいもんです。
ま、悩んでいても始まらないのでまずは掲示板を作ろうと思います。
でも、掲示板というかゲストブックならば、すでにGAEのサンプルの中にあります。
なので、まずはこのゲストブックと同等のものを作って、ちょっとずつ改造していくかーと思っています。
ひながた
今回は、ほんとに基本的な掲示板を作ります。で、どんなものにするかの仕様を考えました。
- googleアカウントがないと見られない
- 新しい順に10件だけ表示する
- 表示は後々のことを考えて、テンプレートエンジンを使う
こんな感じで作っておけば、改造もしやすいでしょう。
この掲示板に足りない機能はかなりあります。その辺りは今後ちょっとずつ機能追加していきたいと思います。
app.yaml
application: bbs version: 1 runtime: python api_version: 1 handlers: - url: .* script: main.py
main.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja-JP" lang="ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <!-- link rel="stylesheet" type="text/css" href="/css/main.css" / --> </head> <body> <a href="{{ url }}">ログアウト</a> / <hr /> {% for article in articles %} {% if article.body %} {{ article.title }} / 投稿者 : {{ article.author }}<br /> {{ article.date }} / M U<br /> {{ article.body }}<br /> <hr /> {% endif %} {% endfor %} <form method="POST" action="/post"> タイトル:<input type="text" name="title"><br /> 名前:<input type="text" name="author"><br /> 本文:<br /> <textarea name="body" cols="50" rows="5"></textarea><br /> <input type="submit" value="投稿/reload"> <input type="reset" value="書き直し"> </form> </body> </html>
notlogin.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja-JP" lang="ja-JP"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="/css/main.css" /> </head> <body> 利用するには<a href="{{ url }}">ログイン</a>が必要です。 <hr /> </body> </html>
main.py
#!/usr/bin/env python import wsgiref.handlers import os import time import cgi import datetime import re from google.appengine.api import users from google.appengine.ext import webapp from google.appengine.ext import db from google.appengine.ext.webapp import template article_limit = 10 # article_order = 'DESC' # 'ASC' 'DESC' class Article(db.Model): author = db.UserProperty() title = db.StringProperty(multiline=False) body = db.StringProperty(multiline=True) date = db.DateTimeProperty(auto_now_add=True) class PostHandler(webapp.RequestHandler): def post(self): article = Article() self.response.out.write("post") article.body = self.request.get('body').strip() if article.body != "": article.body = re.sub("\n","<br />", article.body) article.author = users.get_current_user().nickname() article.title = self.request.get('title').strip() article.put() self.response.out.write("redir") self.redirect('/') class MainHandler(webapp.RequestHandler): def get(self): if users.get_current_user(): articles = db.GqlQuery ( "SELECT * FROM Article ORDER BY date " + article_order + " LIMIT " + str(article_limit) ) url = users.create_logout_url(self.request.uri) template_values = { 'articles': articles, 'url': url } path = os.path.join(os.path.dirname(__file__), 'main.html') self.response.out.write(template.render(path, template_values)) else: url = users.create_login_url(self.request.uri) template_values = { 'url': url } path = os.path.join(os.path.dirname(__file__), 'notlogin.html') self.response.out.write(template.render(path, template_values)) def main(): application = webapp.WSGIApplication([('/', MainHandler), ('/post', PostHandler) ], debug=True) wsgiref.handlers.CGIHandler().run(application) if __name__ == '__main__': main()