ホーム » ハンズオン » 第7回 GTUG Girls “Python x GAE”

第7回 GTUG Girls “Python x GAE”

お題目

コードラボを元に、各自作業する。

はじめに

環境構築の話(今回は宿題の中で実施済みなので、今回は省略)

Part1

Pythonの特徴

  • カッコ{}ではなく、インデント(基本は空白4つ)でブロック
    ※スペースとタブを混同すると変なエラーに遭遇するので注意 => スペース1個でも違うと別の扱いになる。
    => どちらかに統一していればok、スペースの数も統一していればよし
  • 記号は少なめ

sample.py

# coding: UTF-8

# range この場合、1から100まで
for x in range(1, 101):
    if x % 15 == 0:
        print 'FizzBuzz'
    elif x % 3 == 0:
    	print 'Fizz'
    elif x % 5 == 0:
    	print 'Buzz'
    else:
    	print x

その他

</pre>
class Foo:
 # this の代わりに self を使う
 def bar(self):
 print 'foobar'

# グローバルなメソッド定義もできる
 def add(x, y):
 return x + y
<pre>

実習

main.py

ハンドラーファイル
※ app はグローバル変数で、ここに代入していくことで処理が追加される


import webapp2

class MainHandler(webapp2.RequestHandler):
    def get(self):
    self.response.headers['Content-Type'] = 'text/html;charset=utf-8'
    self.response.out.write('</pre>
<h1>こんにちは Google App Engine!</h1>
<pre>')

# debugをTrueにしておくと画面上に詳細なエラーが表示されてしまうので本番に挙げる時はFalseにする
app = webapp2.WSGIApplication([
    ('/', MainHandler)
],debug=True)

app.yaml


application: hello2
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
 static_files: favicon.ico
 upload: favicon\.ico

- url: .*
 script: main.app

libraries:
- name: webapp2
 version: latest

補足

タグ 内容
version バージョンは好きなように付けていい。公開するときに、1と2を分けることで、管理画面で切り替えたりできる。
(バグったら一つ前に戻したり)
handlers どのファイルをどこで処理するかを設定する。
libraries webapp2 を読み込むようにしている。 third partyの場合、対象フォルダに格納してimportさせる必要がある。
=> ここに書いてあるものは、本番サーバにも入ってる。

ジャンゴはGAEに向いてない。

Note

○ホットデプロイなので、コードを書き換えて上書きすれば、ブラウザをリロードするだけでお手軽。
設定ファイル(main.yaml)を修正した場合でも、同様!

○クラウドに保存する場合
from google.appengine.ext import db を冒頭に書き、
モデルに対して処理を追加していくとデータストアに保存してくれる。

○StringProperty は500バイトまでの文字列を保存できる。
それ以上の長さを保存したい場合は、別のPropertyを利用する。

○クラスの定義時に、()の中に指定する事で継承する。

# Greetingは、db(親クラス)のModelクラスを継承する
class Greeting(db.Model):

○ importはどこに書いてもok。頭でなくても、関数の直前でも可能

・ifの中に書いた場合は、他では使われなかったりする。
・import関数だと思って使う(PHPと同じような感じ)

○ まぁ、どれもそうなんだけど、タグの間違いがそのまま挙動につながるので、デバッグ方法が知りたい。致命的な場合は、404エラーになってしまって結構切ない。
内容を加えて行くと、debugタグに対応するようなエラーになってくるので、まぁ、いいのかな。

○ クエリーは、orderメソッド内に、カラム名を入れる。
このとき、頭にminusを付けるとDESCになる。取得したい行数もちゃらっと指定できて便利ですなぁ。(なんか、DB2で頑張った記憶が沸々)

#greetings = db.GqlQuery("SELECT * FROM Greeting ORDER BY date DESC LIMIT 10")
 greetings = Greeting.all().order('-date').fetch(10)

○ ログイン必須にするときの処理。
user情報がある場合は、内容を表示、無い場合は、ログイン画面にリダイレクトする。
※本番環境で実行している場合は、googleのログイン情報が表示される。テストの場合は、仮の画面となる。

class MainHandler(webapp2.RequestHandler):
  def get(self):
  user = users.get_current_user()
  if user:
    self.response.out.write('Hello %s! [<a href="%s">sign out</a>]' % \
      (user.nickname(), users.create_logout_url(self.request.uri)
    ))
  else:
    self.redirect(users.create_login_url(self.request.uri))
    return

○ jinja2の関数を使う時は、パイプラインを書く

{{ greeting.content|escape }}

○ jinjaは、テンプレート => テンプル => 神社。
今はapp engineの中にjinja2が入ってるので、app.yamlのlibrariesに宣言しておけば使えるようになる。
(FWとしてGjangoを使う場合は、テンプレートが内在するので、そちらを使う)

○ HTML上にpythonコードを使うとき、{{}}が変数の表示、{% %}が制御コードとなる。

    {% if user %}
      {{ user.nickname() }}!
      [<a href="{{ logout }}"><strong>sign out</strong></a>]
    {% else %}
      World!
      [<a href="{{ login }}"><strong>sign in</strong></a>]
    {% endif %}

テンプレートの継承もできる。base.htmlに対して、index.htmlを作成する。全画面に対して、共通ヘッダなどを作成したいときに有効。似たようなロジックをWordPressで見た気がする。正直、タグの付け間違いとかあって、微妙にやりづらかったんだけど、これのほうが分かりやすいかも。
=> base.htmlの方にhtmlやheadの処理を記入して、index.htmlではcontentを実装していくイメージ

以上で、Part1は終了。Part2以降に進んでもいいんだけど、時間も中途半端なので、デプロイしてみた。
(アプリ名を適当にしてたので、名前を取得したアプリ名に合わせて修正(yamlのapplicationを変更すればうまくいった)

Part2

mail

すごい簡単に送れる。というか、全然知らない人のアドレスに送りまくることもできるぐらい…。場合によっては、ここにTwitterとかevernoteの投稿用アドレスを指定しておけば、とか、利用方法は無限ですねぇ。

まとめ

今回はドットインストールで予習して参加したので、より面白かった。予習って大切やね。初めてPythonを触ることになったわけだけど、面白かった。個人的には、rubyよりも取っ付きやすい。

そして、言語は所詮、手段だなと思った。この言語が使いたいからアプリを作るのではなくて、アプリを作る為に、今回はpythonを使って見るか、みたいな。その場合、あんまりパフォーマンスはよくないし、精密になればなるほど、そんな知識では足りなくなるだろうけど、個人的に使うのであれば、その程度。

逆にいえば、個人で開発するにはやっぱり限界がある。そして、その限界にも気づきにくい。だから勉強会に参加するのかもしれないですのぅ。

関連資料

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中