Slide 1

Slide 1 text

DjangoとPyramidで 同じアプリ作った話 @mizzsugar0425

Slide 2

Slide 2 text

Who am I?? ・平成6年生まれ ・HRシステムのヘルプデスク(Java)→Pythonプログラマー ・業務ではDjangoで開発 ・最近はIteratorでメモリ節約するのが好きです ・コーヒーは豆から作ります ・自転車乗るのが好きです

Slide 3

Slide 3 text

昨年末、団体用注文アプリ作りました。 お弁当や団体用の 一人の人が何十人もの人の注文を紙でメモして電卓で金額計算して 注文しているのを見て、これは辛いと思い作りました。 Django製です。 https://curry.sugar-code.space/

Slide 4

Slide 4 text

Django以外のフレームワークで作ったら?

Slide 5

Slide 5 text

Djangoのようなフルスタックでないフレーム ワークで作ったら? 作ってみよう!

Slide 6

Slide 6 text

Pyramid使いました。 ・PythonWeb開発フレームワーク ・「小さく、速く、堅実」 ・あまり資料ないのでやってみた

Slide 7

Slide 7 text

もっとも簡単なPyramidアプリケーション 公式チュートリアルより http://docs.pylonsproject.jp/projects/pyramid-doc-ja/en/latest/

Slide 8

Slide 8 text

ここで謝罪・・・ PyramidはHTTPリクエスト・レスポンスのみを扱うフレームワークです。 Djangoでやってくれるような認証やデータベースとの接続などは他のフレームワーク でやっています。 なので、タイトルは厳密にいうと でした_(._.)_ DjangoとPyramid+@で 同じアプリ作った話

Slide 9

Slide 9 text

使用技術比較 ・Django ・PostgreSQL ・Docker ・jQuey ・Pyramid ・PostgreSQL ・Orator ・Pytest ・Docker ・LXC ・Nuxt.js Django Pyramid+@

Slide 10

Slide 10 text

使用技術比較 ・Django ・PostgreSQL ・Docker ・jQuey ・Pyramid ・PostgreSQL ・Orator ・Pytest ・Docker ・LXC ・Nuxt.js Django Pyramid+@ Django HTTPリクエスト、レ スポンス クエリ発行 テスト

Slide 11

Slide 11 text

※今回の発表はViewレイヤーに 焦点を当てます。

Slide 12

Slide 12 text

ルーティング(Django)

Slide 13

Slide 13 text

ルーティング(Django) View関数の中で if request.method == ‘GET’: … のようにリクエストメソッドによる 処理の振り分けをします。

Slide 14

Slide 14 text

ルーティング(Django) path(pattern, view, name) pattern=ルートのパターン(ex. /api/hello)指定 view=そのルートにひもづく view関数 name=ルートの名前(uniqueでないと いけない, not required)

Slide 15

Slide 15 text

ルーティング(Pyramid) add_route(name, pattern) name=ルートの名前(uniqueでないといけな い, required) pattern=ルートのパターン(ex. /api/hello) を指定

Slide 16

Slide 16 text

ルーティング(Pyramid) add_view(view, route_name, renderer, request_method) view=view関数 route_name=add_routeで設定したルートの名前 renderer= request_method=そのview関数のリクエストメソッド

Slide 17

Slide 17 text

View(Django) URLで指定したパラメータを引数とする パラメータなしでリクエストを送ると 自動で404ページが表示される (DEBUG=Falseの場合) View関数内でリクエストメソッドによる 処理の振り分け

Slide 18

Slide 18 text

View(Django) 〜class-based viewの紹介〜 class内のdefで リクエストメソッドごと の処理を振り分ける

Slide 19

Slide 19 text

View(Django) 〜class-based viewの紹介〜 とあるモデルの 登録・更新用の フォームを作成し・・・ ModelFormの場 合、 バリデーションは 基本的に モデルに定義した 通りにやってくれ る。カスタマイズも 可能。

Slide 20

Slide 20 text

View(Django) 〜class-based viewの紹介〜 たった四行で登録画面の View が・・・ エラーメッセージの表示や DBへの登録はよしなに やってくれます。

Slide 21

Slide 21 text

View(Pyramid) request.matchdict[parameter] routingで設定したパラメータ request.matchdict[‘b ody’][parameter] POSTで送られたリクエスト

Slide 22

Slide 22 text

View(Pyramid) 〜デコレータの紹介〜 Pyramidでは @view_config()というデコレータをview関数につけて nameとrouteを指定することもできる カスタマイズしたview_configを作成 することも可能

Slide 23

Slide 23 text

設定の扱い(Django) settingsモジュールに設 定されている変数は どこからでもアクセス可 能。つまり・・・

Slide 24

Slide 24 text

設定の扱い(Django) グローバル変数たくさん! モジュールレベルでの カプセル化ができないPythonの世界では ちょっと危険かも・・・

Slide 25

Slide 25 text

設定の扱い(Pyramid)

Slide 26

Slide 26 text

設定の扱い(Pyramid) add_request_method(callable=None, name=None, property=False, reify=False) リクエストオブジェクトにメソッドまたはプロパティを加えるメソッド。 例えばOratorの場合、DB接続するインスタンスを返すメソッドを add_request_methodに追加しています。

Slide 27

Slide 27 text

Viewのテスト(Django)

Slide 28

Slide 28 text

Viewのテスト(Django) Clientインスタンスに postメソッドを使用するこ とでpostリクエストを送り ます。 ちなみに、getメソッドの 場合は get(route)を利用。 テスト用のクライアント 第一引数のルートに ひもづくview関数を 呼び出します。

Slide 29

Slide 29 text

Viewのテスト(Pyramid)

Slide 30

Slide 30 text

Viewのテスト(Pyramid) リクエストの内容を追加 テストしたいView関数を実行 テスト用の リクエストイン スタンス

Slide 31

Slide 31 text

Pyramid開発で苦戦した点 ・Djangoほどよしなにやってくれない ・View周り以外は他のフレームワークを利用しないといけないのでDjangoと比べると 学習コストがかかる ・Djangoは割と「こうあるべき」というの明示されているが、Pyramidにはないので実 装時に判断に迷うことも

Slide 32

Slide 32 text

個人的にPyramidの好きな点 ・request.add_method良い ・ちょっとした計算結果をモジュール一つでWEBに表示させるのが出来て楽 ・疎結合なアプリケーションを作りやすい ・viewのテスト実行が早い (Djangoはテストのたびにテスト用DBを生成するため) ※ --keepdbオプションで2回目以降のDB作り直しは防げるけどViewだけテストしたい場合は遅い(^^;

Slide 33

Slide 33 text

Django以外のフレームワークでWeb開発した いDjangoerへのアドバイス? ・「Djangoでは〜ができるのに」という考えは捨てましょう!!  (比較するにはDjangoはあまりにも手厚すぎる) ・Djangoやってたら「車輪の再発明」に思えるようなことをすることもあるかも・・・ それも 楽しみましょう!! 最後に・・・

Slide 34

Slide 34 text

ありがとうございました!!