Python3でwebアプリ

44
Python3Webアプリケーション aodag PyConJP2012

Transcript of Python3でwebアプリ

Page 1: Python3でwebアプリ

Python3で

Webアプリケーション

aodagPyConJP2012

Page 2: Python3でwebアプリ

お前誰よ

Atsushi ODAGiriaodag

@aodag

株式会社ビープラウド

Page 3: Python3でwebアプリ

Python3!

Python3.2.3Python3.3rc2来週(9/22)に3.3finalの予定

Page 4: Python3でwebアプリ

Python3での重要な変更

標準ライブラリが整理されたstr,unicodeがbytes,strに。ユニコードと生データとの違いが明確に。相対importの扱いが変更された。相対モジュールをインポートするときは、 "from . "が必要に。

Page 5: Python3でwebアプリ

Python3の情報

PYPI Python3Packages

http://pypi.python.org/pypi?:action=browse&c=533&show=all

Page 6: Python3でwebアプリ

Python3の情報 Wall Of Shame

http://python3wos.appspot.com/

Page 7: Python3でwebアプリ

すでにPython3対応している

フレームワーク

PyramidBottleBoboCherryPyTornado

Page 8: Python3でwebアプリ

Python3での課題

PEP333(WSGI 1.0) であいまいな点が多い

特に文字コード、ユニコード関連

Python3では bytesとstrの違いが明確になった。

WSGIでも明確に! -> PEP3333(WSGI 1.0.1)

Page 9: Python3でwebアプリ

WSGIで行こう

def hello(environ, start_response): start_response(['200 OK', ('Content-type', 'text/plain')]) return [b"Hello"]

from wsgiref.simple_server import make_serverhttpd = make_server('', 8080, hello)httpd.serve_forever()

Page 10: Python3でwebアプリ

(´・ω・`) めんどくさいですねぇ

Page 11: Python3でwebアプリ

とりあえず必要だと思うもの

リクエストオブジェクトルーティングHTMLテンプレート

WSGIサーバー

Page 12: Python3でwebアプリ

WebObで行こう

from webob.dec import wsgify

@wsgifydef hello(request): return "Hello"

from wsgiref.simple_server import make_serverhttpd = make_server('', 8080, hello)httpd.serve_forever()

Page 13: Python3でwebアプリ

WSGIサーバー

cherrypywaitresstornado

Page 14: Python3でwebアプリ

URLディスパッチ

WebDispatch

WSGIアプリの様々なディスパッチをサポート

URLパターン

リクエストメソッド

Page 15: Python3でwebアプリ

WebDispatch

dispatcher = URLDispatcher()dispatcher.add_url('top', '/', index)dispatcher.add_url('hello', '/hello/{name}', hello)dispatcher.add_url('top', '/good-by', bye)

Page 16: Python3でwebアプリ

urlvars

urlパターン:/hello/{name}

実際のurl: /hello/aodagurlvars: {'name': 'aodag'}

@wsgifydef hello(request): name = request.urlvars.get('name', 'world') return "Hello, {0}".format(name)

Page 17: Python3でwebアプリ

テンプレートエンジン

Jinja2MakoChameleonTempita...

Page 18: Python3でwebアプリ

(`・ω・) 意外と充実!

Page 19: Python3でwebアプリ

jinja2

loader=PackageLoader(__name__, 'templates')

env = Environment(loader=loader)

Page 20: Python3でwebアプリ

jinja2

@wsgifydef hello(req): name = req.urlvars.get('name', 'world') tmpl = env.get_template('index.html') return tmpl.render(name=name)

Page 21: Python3でwebアプリ

(`・ω・) これで**MVC**

できるね!

Page 22: Python3でwebアプリ

CSSとか画像とか

どうするの

Page 23: Python3でwebアプリ

NGINXでやれよ!

Page 24: Python3でwebアプリ

と、思いますが、開発中にNginx使うのも萎えるので。

Page 25: Python3でwebアプリ

スタティックファイルを扱う

webob.static.FileAppwebob.static.DiectoryApp

Page 26: Python3でwebアプリ

static_resource = pkg_resources.resource_file(__name__, 'static')

static_app = DirectoryApp(static_resource)

application.add_url('static', '/static/*', static_app)

Page 27: Python3でwebアプリ

(´・ω・`) データはどうしよう

Page 28: Python3でwebアプリ

データベースアクセス

ドライバ: psycopg2ORM: SQLAlchemy

マイグレーション: alembic

Page 29: Python3でwebアプリ

(`・ω・) 予想以上にちゃんと動くぞ!

Page 30: Python3でwebアプリ

セッション

Beaker

Beaker自体は動く

バックエンドは Memory, Fileは問題なしその他のバックエンドは依存ライブラリが対応しているか未確認

Page 31: Python3でwebアプリ

認証

repoze.who (trunk)

多分 2.1 でリリース

使いたければ setup.py の dependency_links に以下を追加

https://github.com/repoze/repoze.who/zipball/master#egg=repoze.who-2.1dev

Page 32: Python3でwebアプリ

フォームライブラリ

deformcolander

問題なく利用可能。っていうか僕が対応しました(・∀・)

Page 33: Python3でwebアプリ

画像処理

pillow はよ

Page 34: Python3でwebアプリ

(´・ω・`) PILとかは非公式パッチで

動くらしいですねぇ

Page 35: Python3でwebアプリ

       |   \  __  /   _ (m) _ピコーン      |ミ|    /  `´  \     ('A`)     ノヽノヽ       くく

Page 36: Python3でwebアプリ

画像処理

PyQtにQImageがあるじゃないか!

Page 37: Python3でwebアプリ

PyQt

説明しよう!PyQtとは!UNIX系のデスクトップ環境KDEで採用されていることで有名なGUIツールキットQtのPythonバインディングである!つまり!画像をリサイズするためだけに、GUIツールキットを使おうとしているのである!

Page 38: Python3でwebアプリ

(゚д゚ )

Page 39: Python3でwebアプリ

( ゚д゚ )

Page 40: Python3でwebアプリ

QImageを使うために

QImageがQtGUIモジュールにあるため、ヘッドレス不可能LinuxだったらX11が必要になります

Qtをインストール

PyQtをインストール

Page 41: Python3でwebアプリ

ファイルアップロードからの

サムネイル保存

data = validated['image']['fp'].read()image = QtGui.QImage.fromData(data)thumbnail = image.scaled(128, 128, aspectRatioMode=Qt.KeepAspectRatio)thumbnail.save(thumbnail_filename)

Page 42: Python3でwebアプリ

まとめ

画像処理だけ難あり?他は結構でそろっている

が、実際にはフレームワークを使うことになるでしょう。

Page 43: Python3でwebアプリ

つまり、Django待ち

Page 44: Python3でwebアプリ

参考

● Wall of Shame http://python3wos.appspot.com/

● PyPI Python3 Packages http://pypi.python.org/pypi?:action=browse&c=533&show=all

● Python Web Server Gateway Interface v1.0● http://www.python.org/dev/peps/pep-333/● Python Web Server Gateway Interface v1.

0.1 http://www.python.org/dev/peps/pep-3333/