はじめてのPython
Google App Engineでお気軽
Webアプリ開発
本田 克己@GDD九州
こちらのイベント向けの資料です
https://www.facebook.com/events/272819922852292/
GDG九州って
GDG九州はGoogle関連の技術が好きな開発者、使っている開発者、使いた
い開発者の交流の場です。
Googleが直接運営している訳ではありません。
ちなまにGDGはGoogle Developer Groupsの頭文字らしいです。
以前はGTUG(Google Technology User Groups)という名前でした。
福岡の他、九州各地で勉強会を開いています。
昨年、大分では温泉合宿を行っています。
Google+やFacebookのグループで情報交換などを行なっています。
「GDG九州」で検索して、是非グループに参加してみてください。
はじめに
今日やること
●
Pythonのお勉強 : 20分
●
Google App EngineでWebアプリを作る : 20分
● その他の時間 : 5分
と、大丈夫ですか?って感じのスケジュールになっています。
インタラクティブシェルでPythonに触れてみる
Pythonには、インタラクティブシェルというのが用意されていま
す。
インタラクティブシェルを使うと対話的にPythonを使用できます。
Windowsな人 Macな人
スタートメニューから
Python(command line)
を実行します
ターミナルを開いて
python
と入力してreturnキー
ターミナルは、アプリケーショ
ンフォルダのユーティリティに
入っています。
Spotlightで検索してもいいかも
スタートメニューから
Python(command line)
を実行します
インタラクティブシェル
こんな感じのが表示されればOK
Pythonでプログラム書いてみる
インタラクティブシェルで、プログラムを書いてみます。
>>> の後ろに入力して、Enterキーを押します。
>>> 1 + 1
2
>>> print('Hello world!')
Hello world!
Python簡単だ�
インタラクティブシェルの終了
Windowsの人
Ctrl + z を押したあと、Returnキーを押します
>>> ^Z
となっている状態でReturnキー
Macの人
Ctrl + d を押します。
Pythonの基本 : 変数
データを保持しておくのに、変数を使うことができます。
変数名の大文字、小文字は区別されます。
変数の最初の文字に数字は使えません
変数に日本語などの文字は使えません(3.xからは使えます)
>>> a = 1
>>> b = 2
>>> c = 3
>>> a + b + c
6
>>> first_name = 'katsumi'
>>> last_name = 'honda'
>>> full_name = first_name + ' ' + last_name
>>> print(full_name)
katsumi honda
Pythonの基本 : 数値
数値は、割と直感的に使えるので、今のところは細かいことは気にし
なくても大丈夫です。
数値の先頭を0から始めると、8進数として扱われるので、ここだけ注
意してください。
(16進数は0xから始めます)
>>> a = 100 # 10進数
>>> b = 0100 # 8進数
>>> c = 0x100 # 16進数
>>> print(a, b, c)
(100, 64, 256)
>>>
Pythonの基本 : 数値の演算
加算 : +
減算 : -
乗算 : *
除算 : /
余り : %
べき乗 : **
>>> a = 10
>>> b = 3
>>> a + b
13
>>> a - b
7
>>> a * b
30
>>> a / b
3
>>> a % b
1
>>> a ** b
1000
Pythonの基本 : 文字列
文字列は、' か “ で囲みます。
クォーテーションの前にuをつけるとUnicode文字列になります。
日本語の文字列を扱う時は、Unicode文字列を使うようにしておいたほ
うが問題が起こりにくいので、uをつけるようにしましょう。
長い文字列はクォーテーションを3つ繋げて囲むと便利です。
>>> fruit = 'apple'
>>> fruit = u'りんご'
>>> print(fruit)
りんご
>>> long_text = u'''今日は
... はじめてのPythonに
... 参加しています'''
>>> print(long_text)
今日は
はじめてのPythonに
参加しています
Pythonの基本 : 何もない値
>>> money = None
>>> print(money)
None
何もないことを表すのに、Noneを使います。
Pythonの基本 : 真偽値
プログラムの条件分岐とかで使うやつです
True
False
と、頭文字が大文字になります
>>> t = True
>>> f = False
>>> t, f
(True, False)
Pythonの基本 : 論理演算
真偽値の組み合わせて判断する時に、論理演算を行います。
and or not を使います。
>>> True and True
True
>>> True and False
False
>>> False and False
False
>>> True or True
True
>>> True or False
True
>>> False or False
False
>>> not True
False
>>> not False
True
Pythonの基礎 : 文字列の操作
>>> 'hello ' + 'world'
'hello world'
■連結
文字列と文字列を + で繋げられます
>>> 'hello' * 10
'hellohellohellohellohellohellohellohellohellohello'
■繰り返し
文字列に数字を掛けると、文字列を繰り返します
■フォーマット
%sや%d等を含んだフォーマット文字列に、%演算を行うと値を埋め込めます
>>> 'hello %dst %s' % (1, 'python')
'hello 1st python'
Pythonの基本 : リスト、タプル、辞書
複数の値を扱うのに、リストやタプル、辞書を使うと便利です
■リスト
順序を持った値の集合です。
値の追加や削除など、変更が行えます。
[ と ]で囲んで、値をカンマで区切ります。
■タプル
リストと同じような感じですが、変更が行えません。
( と )で囲んで、値をカンマで区切ります。
■辞書
キーと値を組み合わせた集合です。
連想配列とかいうのと同じです。
{ と }で囲んで、
キー: 値の組み合わせをカンマで区切ります
Pythonの基本 : リスト
>>> mylist = ['apple', 100]
>>> mylist[0]
'apple'
>>> mylist[1]
100
>>> mylist[2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
>>> mylist.append(True)
>>> mylist
['apple', 100, True]
1つのリストに色々な型の値を入れることができます。
リストの変数の後に [] で数字を指定すると、その場所の値が得られます
(この数字を添字といいます)
appendでリストに追加できます
Pythonの基本 : タプル
>>> mytuple = ('abc', 123)
>>> mytuple[0]
'abc'
>>> mytuple[1]
123
>>> mytuple[1] = 234
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
リストと同じように使えますが、変更だけできません。
Pythonの基本 : 辞書
>>> mydict = {'name': 'apple', 'price': 100, 1: True}
>>> mydict
{1: True, 'price': 100, 'name': 'apple'}
>>> mydict['name']
'apple'
>>> mydict[1]
True
キーには、文字列以外に数値など、使用出来ます。
が、文字列を使うことがほとんどです。
タプルもたまにキーに使うことがあります。
リストはキーには使えません。
>>> mydict[(1,1)] = 'red'
>>> mydict
{1: True, 'price': 100, 'name': 'apple', (1, 1): 'red'}
Pythonの基本 : インデント
Pythonでは、コードブロックを表すのにインデントが使われます。
こんな感じになります。
とりあえず入力して実行してみましょう
>>> for i in range(50):
... if i > 0 and (i % 3 == 0 or i % 10 == 3):
... print i
...
インデントをつける前の行末のコロン : を忘れないように気を
つけてください。
インデントの数は、同じコードブロックで統一されていれば問
題ありません。
一般的にはインデントに半角スペースを4つ使用します。
Pythonの基本 : 条件分岐
変数の内容などによって、プログラムの動作を切り替えたりするの
を条件分岐といいます。
if else elif を使います。
>>> food = 'karaage'
>>> if food == 'toriten':
... print 'nice!'
... elif food == 'karaage':
... print 'so-so'
... else:
... print 'what?'
...
so-so
Pythonの基本 : 繰り返し
繰り返して処理を行う時は、forループかwhileループを使います。
■forループ
リスト等の集合を1つずつ取り出して実行します。
range()関数で任意の数の、リストが生成できるので組み合わせて
使用することも多いです。
>>> for i in range(10):
... print i
...
0
1
2
3
4
5
6
7
8
9
Pythonの基本 : whileループ
条件が真(True)の間、繰り返し処理を行います
>>> i = 10
>>> while i > 0:
... print i
... i = i - 1
...
10
9
8
7
6
5
4
3
2
1
Pythonの基本 : 繰り返し
>>> for food in ['toriten', 'karaage', 'tatutaage']:
... print '%s : %d' % (food, len(food))
...
toriten : 7
karaage : 7
tatutaage : 9
任意のリストを順番に処理できます。任意のリストを順番に処理できます。
ここでは、それぞれの文字数を表示しています。
len()関数で、文字の長さや、リストの長さを取得できます。
Pythonの基本 : 関数
何度も行う処理は、コピペしないで関数にまとめます。
def 関数名(パラメータ1, パラメータ2, ...):
関数の処理
return 処理結果
といった感じで関数を定義します。
関数を実行する時は
関数名(パラメータ1, パラメータ2, …)
という感じです。
Pythonの基本 : 関数
>>> def oita_check(food):
... if 'toriten' == food:
... return 'nice'
... elif 'karaage' == food:
... return 'so-so'
... else:
... return 'what?'
...
>>> oita_check('tatutaage')
'what?'
>>> oita_check('toriten')
'nice'
>>>
大分チェック関数を作ってみる
Pythonの基本 : モジュール
様々な機能がモジュールとして提供されています。
モジュールの機能を使う為には、 import で、モジュールをインポート
します。
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2013, 4, 18, 15, 45, 32, 263188)
datetimeモジュールをインポートして、現在日時を取得しています。
datetime.datetimeというのが冗長ですが、
from モジュール名 import インポートするもの
という形式を使用することもできます
>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2013, 4, 18, 15, 51, 4, 803230)
Pythonの基本 : クラス
オブジェクト指向とかいうので出てくるクラスです。
class Food(object):
def __init__(self, name, price):
self.name = name
self.price = price
def how_match(self, gram):
print '%sの値段は%d円です' % (self.name,
self.price * gram / 100.0)
toriten = Food(u'とり天', 200)
toriten.how_match(150)
こんな感じで使います。
クラスの名前は、大文字で始めるのが一般的です。
クラス名(パラメータ...)で、オブジェクトが作られます
__init__関数は、オブジェクトが作られる時に呼ばれます
Pythonの基本
他にも、色々と知っておいたほうがいい決まりとか、便利な機能と
かがあるのですが、これまでの内容がなんとなくわかれば、なん
となく作り始められます。
全部を理解していなくても大丈夫です。
エディタを使う
インタラクティブシェルは、すぐ実行結果が分かって便利ですが
何回も使うコードを毎回入力するのは大変です。
エディタを使って、コードをファイルに保存しましょう。
文字コードの指定
ファイルを保存する時は、UTF-8を指定してください。
(UTF-8じゃないとダメって訳じゃないですが、統一しておきます)
ファイルの拡張子は .py にします。
ファイルの1行目か2行目に、
# -*- coding: utf8 -*-
という行を入力します。
(これでPythonにファイルの文字コードを教えてあげています)
エディタでコードを書いてみる
#!/usr/bin/env python
# -*- coding: utf8 -*-
class Food(object):
def __init__(self, name, price):
self.name = name
self.price = price
def how_match(self, gram):
unit = gram / 100.0
print('%s : %d' % (self.name, self.price * unit))
if __name__ == '__main__':
karaage = Food('karaage', 200)
toriten = Food('toriten', 180)
karaage.how_match(200)
toriten.how_match(300)
アプリケーションの設定
Application Nameに guest-book
Application Directoryに デスクトップ等を指定して
[Create]ボタンを押します。
Admin Port, Portは、他の開発ツールとバッティングしないように
気をつけてください。
起動してみる
guest-bookが選択された状態で、[Run]ボタンを押します。
Webブラウザで http://localhost:8080/ にアクセスします。
Port番号を変更した場合は、8080の部分を合わせてください。
Google App EngineでWebアプリを作る
準備万端なので、いよいよWebアプリを作ります。
ゲストブック的なものを作ってみましょう。
まずはGoogleAppEngineLauncherを起動します。
メニューから [File] → [New Application] を選択します
Hello world!
Hello world!!
って表示されました?
表示できた人は、周りで困っている人がいたら助けてあげてください
入力フォーム
guest-bookのmain.pyを開いて編集していきます。
2行目に
# -*- coding: utf8 -*-
を追加します。
template という変数名で、HTMLを入力します。
MainHandlerクラスのget関数内の
self.response.write() に templateを渡します
import webapp2
template = u'''<!doctype html>
<html>
<head><title>ゲストブック</title></head>
<body>
<h1>ゲストブック</h1>
<form method="post">
<label>お名前<input type="text" name="name"></label><br>
<label>メッセージ<input type="text" name="message"></label><br>
<input type="submit" value="書き込む">
</form>
</body>
</html>
'''
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write(template)
app = webapp2.WSGIApplication([
('/', MainHandler)
], debug=True)
ブラウザをリロードすると、
こんな画面が表示されます。
[書き込み]ボタンを押すと
怒られます
MainHandlerクラスに、post関数を追加します。
(とりあえず get と同じにしておきます )
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write(template)
def post(self):
self.response.write(template)
入力内容を表示してみる
postしたときに、フォームの内容を表示するようにしてみます。
postしたフォームの内容は、
self.request.POST['名前']
で取得出来ます。
templateをフォームの内容を表示する前の部分と、後ろの部分に分割
import webapp2
template1 = u'''<!doctype html>
<html>
省略
<input type="submit" value="書き込む">
</form>'''
template2 = u'''</body>
</html>
'''
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write(template1)
self.response.write(template2)
def post(self):
self.response.write(template1)
name = self.request.POST['name']
message = self.request.POST['message']
append = "%s : %s" % (name, message)
self.response.write(append)
self.response.write(template2)
import webapp2
template1 = u'''<!doctype html>
<html>
省略
<input type="submit" value="書き込む">
</form>'''
template2 = u'''</body>
</html>
'''
class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.write(template1)
self.response.write(template2)
def post(self):
self.response.write(template1)
name = self.request.POST['name']
message = self.request.POST['message']
append = "%s : %s" % (name, message)
self.response.write(append)
self.response.write(template2)
保存してみる
データを保存するためのクラスを定義します。
from google.appengine.ext import db
class Greeting(db.Model):
author = db.StringProperty()
message = db.StringProperty(multiline=True)
date = db.DateTimeProperty(auto_now_add=True)
postした時に、Greetingオブジェクトを保存するようにします
greeting = Greeting()
greeting.author = name
greeting.message = message
greeting.put()
管理画面
http://localhost:8000/ にアクセスすると、管理画面が表示されます。
Datastore Viewerを開くと、データの登録状況が確認できます。
保存内容を表示する
def render(self):
self.response.write(template1)
greetings = db.GqlQuery("SELECT * FROM Greeting")
for greeting in greetings:
self.response.write(
'%s : %s<br>' % (cgi.escape(greeting.author),
cgi.escape(greeting.message))
)
self.response.write(template2)
getでもpostでも表示できるように、render関数を追加してみます
データの取得は、db.GqlQueryで行えます
def get(self):
self.render()
def post(self):
name = self.request.POST['name']
message = self.request.POST['message']
greeting = Greeting()
greeting.author = name
greeting.message = message
greeting.put()
self.render()
getとpostから、render関数を呼ぶように変更します。
今日はここまで!
おつかれさまでした�

はじめてのPython