前回のあらすじ
ひょんなことからpythonのwebフレームワークBottleで遊び始めた俺だったが、Herokuにデプロイしてみるとページの表示がおかしくなっていた。
今回の話: ファーストシーズンを見逃すな。
問題はサーバーサイドプログラミングの基本的な部分にあると気づいたのですが、ググるキーワードもよくわからないレベルです。そこで歴史の勉強から始めることにして、「WEB+DB PRESS 総集編〔Vol.1~72〕」のpdf過去記事データを読み漁っていきました(この総集編はお値打ちだと思います)。定期刊行物なので、その時々の「最新」情報が得られます。既存技術→問題点→最新技術の経緯をたどっていくと、どうしてこの技術が出てきた(持ち上げられる)のかというのが、おぼろげながら見えてきます。僕はAngularJSで学習を始めたので、ドラマでいうとたぶんサードシーズン(のスピンオフ?)くらいからの視聴者のようです。とりあえずファースト世代の会話が理解できるくらいには知識を得ておけば、今後のストーリー展開も楽しめそうです。
学んだこと: ステートレス
簡易なサンプルにして試してみました。
- グローバル変数に状態を格納していたとき
これだとサーバーが変わるとデータが引き継げない。gunicornでworker=3にして問題が出ていたのはそういうこと。
stateful.py
# global var
myCat = "cat"
myDog = "dog"
# routing root
@app.route('/', method='GET')
def myDef():
global myCat
global myDog
return template ('<div>{{myCat}},{{myDog}}</div><a href="/cat">cat</a><br><a href="/dog">dog</a>', myCat=myCat,myDog=myDog)
# cat
@app.route('/cat', method='GET')
def next():
# global var
global myCat
# set var
myCat = "myao"
return redirect('/')
# dog
@app.route('/dog', method='GET')
def next():
# global var
global myDog
# set var
myDog = "waon"
return redirect('/')
- urlを使ってみる例。
stateless.py
#routing root
@app.route('/', method='GET')
@app.route('/<myDog>/<myCat>',method='GET')
def good(myDog="myDog", myCat="myCat"):
return template ('<div>{{myCat}},{{myDog}}</div><a href="/myDog/myao">cat</a><br><a href="/waon/myCat">dog</a>', myCat=myCat, myDog=myDog)
Bottleにdynamic routes (e.g. /hello/)があるは知っていましたが、ようやく意味がつかめました。