当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

ITエンジニアの技術力UPをお約束します。

Python3 Bottleフレームワーク入門(その5)- Cookie And Session

Python3 Bottleフレームワーク入門(その5)- Cookie And Session


本チャプターでは、クッキー、セッションまわりについて解説します。クッキーはご存じの通り一度来訪するとその時の行動でアクションした記録が残り次回の来訪時にその情報が適用されてWEB画面に反映される仕組みである。またセッションはログインしている状態を記録し、ページ遷移や次回のブラウザ起動時にログイン無しでページに入れる仕組みなどに使われます。



クッキーの仕組みは標準でBottleから利用できるため特に特殊なライブラリーを新規で導入することはありません。response関数で設置することができます。

クッキーの設定例

下記は、ブラウザーからhttp://xxx.xxx.xxx.xxx/counterを表示させリロードするとその度にカウンタ値があがるプログラムです。サーバを終了してもクッキーが残っているためまた起動してテストすると前回の値から加算されてゆきます。ブラウザをとじて再テストしても同様です。クッキーはブラウザー側に残っているためこのようになります。

クッキーの削除

今度はクッキーのリセット機能を追加しました。下記のようにクッキーのエイジングを0にしてカウンタ値も一旦空にします。これが事実上のクッキーの削除のようなものです。ブラウザーからhttp://xxx.xxx.xxx.xxx/resetを表示させ再度カウンター表示のページに飛ぶとカウンターが1からスタートしていることがわかります。

セッションの機能を使う

セッションの機能を使うにはBottleの場合、Beakerというモジュールを使うことができます。インストールはpipコマンドで 導入してください。

先程のクッキーのカウントアッププログラムと同じ要領でブラウザーからアクセスしてみてください。結果的にクッキーと同じような動作を確認できます。

セッションの削除の様々なパターン

一口に削除と言っても様々なパターンがある。値を初期化する。データを削除する。今のセッションを廃棄する。プログラムの流れ用途によってどれを使うか考えて使いましょう。



Python Bottle Framework入門 全13回
1.基礎編サーバ起動
2.リクエストメソッド
3.ORM Peewee (MySQL)
4.ORM Peewee CRUD
5.Cookie And Session
6.Abort and Redirect
7.マルチスレッドWEBサーバ
8.デーモン化
9.Json
10.WSGI on SSL
11.Apache連携起動(外部WSGI) SSL接続
12.Apache連携起動(ReverseProxy)SSL接続
13.hprox連携起動(ReverseProxy)SSL接続&HTTP2対応

合わせて読みたいPython MySQL操作関連

タグ: , , ,

Python3 Bottleフレームワーク入門(その3)- ORM Peewee (MySQL)


今回はデータベースを使ったケースを学んでいきましょう。フレームワークでの入門編ではほとんどのケースサンプルで載っているのは、Sqlite3を使ったケースが多いですが、実際の運用を考えて実験するとやはりMySQLでの実験運用が現実的と考える。やはり微妙に書き方が変わる可能性があるためそうした方が良いと思います。


また、今の時代フレームワークでORMを使うのが当たり前になってきているためBottleで利用できるORMの一つpeeweeを紹介したいと思います。やはりORMの利用で飛躍的にDBのCRUD処理が楽ちんになります。

peeweeの導入

peeweeを導入するにあたり今回はMySQLを使用した前提で説明していきたいと思います。

必要なMYSQLドライバーを事前にpipやbrewなどで導入してください。

必要ドライバー

  • MySQL-python
  • PyMySQL

peeweeを導入できたら最初にコードを作る前にMySQLでテーブルを作って見ましょう。既に既存で存在するテーブルからコードを生成する機能が用意されています。

上記のようなデータベースをMySQLで作成してみましょう。このコードをexport.sqlとして保存し、次のようにしてテーブル作成すると簡単で良いと思います。

下記のように指定を行って任意のファイルmodels.pyへ出力をしてすると自動的にORM操作を行う際に必要なテーブルのclassを生成してくれます。

DBから特定ユーザデータを抜き出して表示するプログラムを見てみましょう。

実際にブラウザからhttp://xxx.xxx.xxx.xxx:8080/user/James というようにチェックするためには、テーブルにダミーデータを入れておく必要があります。

◯ テストデータをDBへインサート

これで全ての準備が整ったので、改めてブラウザからhttp://xxx.xxx.xxx.xxx:8080/user/kazuoでアクセスしてみましょう。下記のように表示されたら成功です。



Python Bottle Framework入門 全13 回
1.基礎編サーバ起動
2.リクエストメソッド
3.ORM Peewee (MySQL)
4.ORM Peewee CRUD
5.Cookie And Session
6.Abort and Redirect
7.マルチスレッドWEBサーバ
8.デーモン化
9.Json
10.WSGI on SSL
11.Apache連携起動(外部WSGI) SSL接続
12.Apache連携起動(ReverseProxy)SSL接続
13.hprox連携起動(ReverseProxy)SSL接続&HTTP2対応

合わせて読みたいPython MySQL操作関連

タグ: , , , , ,

Python3 Bottleフレームワーク入門(その2)- リクエストメソッド


今回の記事では、Bottleのリクエストメソッドについて書きたいと思います。


リクエストメソッドってなんだろう!?と思う方もいるでしょう。WEBブラウザーでURLを指定して表示するのはGETというリクエストメソッドです。逆にコンテンツ側からサーバへ送信するような入力フォームのページはPOSTと言います。この2つを取りえず覚えて置くと良いでしょう。


これまでのプログラムの中で@app.route(URLパス)と書いていたのはデフォルトでメソッドを指定しなければGET処理のルーティングでした。Bottleではパラメータでメソッドを指定してルーティングさせる他にもっと簡潔な書き方があります。 以下に示す書き方はどれも同じ処理の書き方です。

メソッドを意識してルーティングするなら下記の書き方がわかりやすくて良いですね。

デコレータは以下のように重ね合わせも可能だ。ログインの場合などはログインする前とログイン認証、ログイン認証した後が考えられる。ユーザ関数の中のどのメソッドで呼び出されたのか判定しロジックを充ててゆくように記述する。判定はクッキーやセッションで認証しているか否かでわかるだろう。

メソッドのデコレータはget(), post(), put(), delete() or patch()が用意されています。



Python Bottle Framework入門 全13回
1.基礎編サーバ起動
2.リクエストメソッド
3.ORM Peewee (MySQL)
4.ORM Peewee CRUD
5.Cookie And Session
6.Abort and Redirect
7.マルチスレッドWEBサーバ
8.デーモン化
9.Json
10.WSGI on SSL
11.Apache連携起動(外部WSGI) SSL接続
12.Apache連携起動(ReverseProxy)SSL接続
13.hprox連携起動(ReverseProxy)SSL接続&HTTP2対応

合わせて読みたいPython MySQL操作関連

タグ: , , ,

Python3 Bottleフレームワーク入門(その1)- 基礎編サーバ起動


Python Bottleフレームワーク

Python Bottleフレームワークとは、Pythonのフレームワークの中でも小さいフレームワークの中ではメジャーなものです。いちばん有名なDjangoはPythonの中では最もよく使われるフレームワークで至れりつくせりのフルスタックフレームワークですが、マイクロフレームワークと呼ばれるBottleフレームワークは1ファイルで動く極小の軽快に動作するフレームワークです。個人的には最初Flaskを頻繁に使っていましたが、Bottleの方がモジュールの呼び出し方がわかりやすく書けることのほうが多いので今ではちょっとした調べ物や実験はBottleで書くようになりました。学習コストと使用感はFlaskもBottleもさほど変わらないと思います。ライブラリーはFlaskのほうが多いのですが足りないものを自分で作る喜びもありますからそういう意味でBottleが好きです。

マイクロフレームワークを使用する意義は、本格的な複数エンジニアでの開発というよりは一人で開発するケース、もしくはPythonの学習用、大きなシステム開発のモジュールプログラムのプロトタイプ開発用として利用するのが良いと思います。

Bottleの必要性

  • 大規模なフレームワークで高度なモジュール開発するとモジュール単体のバグが見えにくい。bottleで単体テストしてから載せるとベター。
  • 大規模なフレームワークで高度な改造をしようとすると自分自身できちんとMVCのプログラム的深い理解が必要。至れりつくせりの環境ではコードを書く機会が減るため理解が薄くなりがち。
  • ちょっとした数画面程度のユーテリティを作るのに最適。

Bottleのインストール

pythonが導入されpipコマンドが既に導入されているとみなし下記を実行してください。

Bottle + Pythonだけで簡単な起動テスト

BottleとPythonのみで簡単にコンテンツからWEBサーバの起動までを数行で記述できます。下記はBottle Frameworkで案内されている最初の起動について書かれたものです。ちなみにrun関数はBottleフレームワークのWEBサーバを起動するコマンドです。

記述したプログラムをindex.pyと保存してpythonでプログラムを実行するとWEBサーバが起動します。

でも、これだとローカル端末からでなければブラウザアクセスができません。SSHターミナルで確認するならばcurlを使うことである程度は確認できます。

では、他の端末でWEBブラウザを開いてアクセスするにはどうしたらよいかですがrun関数のhostパラメータの記述を変更することでどの端末からでもアクセスできるようにできます。”0.0.0.0″はインターネット上全くマスクしていない開放状態であるためどこからでもアクセスができます。つまり全てのNICでリッスンしますという意味になります。サーバのホストのIPを設定するやり方もありますがその場合はサーバにNICのIPを特定で一つ指定します。複数枚NICが使われてどのNICからカミングしてきたパケットもアクセスするなら0.0.0.0を指定します。Listen Bindアドレスと思って頂ければわかりやすいかもしれません。

ブラウザーからは、「http://192.168.1.100/hello/James」などとコンテンツを設置しているサーバーのIPアドレスを指定します。ブラウザーには「Hello James!」と表示されるはずです。

もし、表示されない場合は大きく2つ原因が考えられます。Firewallが8080番ポートを許可していない。SELinuxがEnableになってる場合などです。この場合はFirewallで8080ポートを許可してください。またSELinuxを一時的にOFFして試してみてください。

今度は単なるスクリプト記述からメインルーチンを呼んで起動してみましょう。

先ほどと少し記述の仕方が変わりました。app変数にBottleのクラスを呼んでインスタンスを作っています。 このようにすると後々Bottleの挙動をパラメータで変更できたりします。それに従って部分的に呼び出し方も 変わっています。run関数のapp=appはappパラメータにBottleのインスタンスを代入しています。インスタンスで利用する場合はこのようにappパラメータでrun関数に教えて上げる必要があります。また最下行から2番めで「if __name__ == “__main__”:」の箇所はpythonでいうところのmainルーチンの宣言です。reloader=Trueはプログラミングコードを書き換えると通常はBottleWEBサーバの再起動が必要だがこれを指定するとコードを修正すると自動で再読込を行ってくれるスイッチになります。

Bottleのルーティング

フレームワークでルーティングと言うのはブラウザで入力するURLを指しています。ドメインの後に続くURIパスを検知して実行するプログラムが起動するようにBottleの仕組みは用意されています。つまり@app.route(URIパス)が動作のきっかけを作りブラウザのURIと合致した場合、その後に続く関数が実行される作りになっています。今回の例ではダイナミックルーティングという方法で/helloの後に名前を付加すると名前の部分の変数が関数の引数に渡されてtemplate関数に処理されてホームページ上に表示される様になっています。尚template関数はBottleのデフォルトのテンプレートエンジンです。

Bottleの最も簡単なレンダリング方法

前回は表示でtemplate関数を使っていましたがもっと簡単な方法があります。 @viewデコレータを使う方法です。そして合わせてこれを使う場合に用意しておきたいのが標準外のテンプレートエンジンです。Bottleではいくつかのテンプレートエンジンが使えるようになっています。ここでは独断と偏見でMakoテンプレートエンジンを使ってみます。(※pip install Makoでインストールしてください。)では次のプログラム例を見てみましょう。

黄色反転箇所に注目します。 1行目のmako_viewを読み出して別名viewとして利用できるようにしています。 また実際に6行目から9行目にかけて/hello/[名前]で入力されたURLの処理をindex関数で行い最終的にreturnで受取りmako_viewデコレータへ渡しています。この際に注意が必要なことは変数を辞書形式でテンプレートエンジンへ戻す必要があるということです。Viewで渡った雛形テンプレート側では辞書の要素名で参照されるため注意しましょう。

makoテンプレートエンジンを使う場合の注意

先程のプログラムの表示はmakoテンプレートを使用していましたが、実際にそのテンプレートをどのように置くべきか説明したいと思います。デフォルト設置パスはBottleでviewデコレータを使う場合、viewsディレクトリが指定されています。 ディレクトリを作成しそこへ指定したファイルベース名+拡張子をつけて保存します。拡張子はtplとかhtmlなどが良いでしょう。例えば@views(‘hello’)ならhello.htmlとしてベースディレクトリ配下のviewsディレクトリの中へ保存します。

先程実行したプログラムで使用したテンプレート

makoのテンプレートの書き方はよく見かけるような記述なので過去にテンプレートエンジンやMVC使った事がある方ならすぐに馴染むことでしょう。

◯ views/hello.html

◯ views/layout/base.html

makoテンプレートエンジンの文法についてはこちらを参照ください。makoは現在でも活発に更新が行われているテンプレートエンジンなのでおすすめです。

mako template

Python Bottle Framework入門 全13回
1.基礎編サーバ起動
2.リクエストメソッド
3.ORM Peewee (MySQL)
4.ORM Peewee CRUD
5.Cookie And Session
6.Abort and Redirect
7.マルチスレッドWEBサーバ
8.デーモン化
9.Json
10.WSGI on SSL
11.Apache連携起動(外部WSGI) SSL接続
12.Apache連携起動(ReverseProxy)SSL接続
13.hprox連携起動(ReverseProxy)SSL接続&HTTP2対応

合わせて読みたいPython MySQL操作関連

タグ: , , ,

1 2 3