むずかしいことはわかりません

いろいろ書いてるみたいな

その6 - なにやってるかわかりません。

とりあえずpythonGoogle 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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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()