Python3でwebアプリ

5,805 views

Published on

Python3でwebアプリ

  1. 1. Python3でWebアプリケーション aodag PyConJP2012
  2. 2. お前誰よAtsushi ODAGiriaodag@aodag株式会社ビープラウド
  3. 3. Python3!Python3.2.3Python3.3rc2来週(9/22)に3.3finalの予定
  4. 4. Python3での重要な変更標準ライブラリが整理されたstr,unicodeがbytes,strに。ユニコードと生データとの違いが明確に。相対importの扱いが変更された。相対モジュールをインポートするときは、 "from . "が必要に。
  5. 5. Python3の情報PYPI Python3Packageshttp://pypi.python.org/pypi?:action=browse&c=533&show=all
  6. 6. Python3の情報 Wall Of Shamehttp://python3wos.appspot.com/
  7. 7. すでにPython3対応しているフレームワークPyramidBottleBoboCherryPyTornado
  8. 8. Python3での課題PEP333(WSGI 1.0) であいまいな点が多い特に文字コード、ユニコード関連Python3では bytesとstrの違いが明確になった。WSGIでも明確に! -> PEP3333(WSGI 1.0.1)
  9. 9. 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()
  10. 10. (´・ω・`)めんどくさいですねぇ
  11. 11. とりあえず必要だと思うものリクエストオブジェクトルーティングHTMLテンプレートWSGIサーバー
  12. 12. 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()
  13. 13. WSGIサーバーcherrypywaitresstornado
  14. 14. URLディスパッチWebDispatchWSGIアプリの様々なディスパッチをサポートURLパターンリクエストメソッド
  15. 15. WebDispatchdispatcher = URLDispatcher()dispatcher.add_url(top, /, index)dispatcher.add_url(hello, /hello/{name}, hello)dispatcher.add_url(top, /good-by, bye)
  16. 16. urlvarsurlパターン:/hello/{name}実際のurl: /hello/aodagurlvars: {name: aodag}@wsgifydef hello(request): name = request.urlvars.get(name, world) return "Hello, {0}".format(name)
  17. 17. テンプレートエンジンJinja2MakoChameleonTempita...
  18. 18. (`・ω・) 意外と充実!
  19. 19. jinja2loader=PackageLoader(__name__, templates)env = Environment(loader=loader)
  20. 20. jinja2@wsgifydef hello(req): name = req.urlvars.get(name, world) tmpl = env.get_template(index.html) return tmpl.render(name=name)
  21. 21. (`・ω・) これで**MVC** できるね!
  22. 22. CSSとか画像とかどうするの
  23. 23. NGINXでやれよ!
  24. 24. と、思いますが、開発中にNginx使うのも萎えるので。
  25. 25. スタティックファイルを扱うwebob.static.FileAppwebob.static.DiectoryApp
  26. 26. static_resource = pkg_resources.resource_file(__name__, static)static_app = DirectoryApp(static_resource)application.add_url(static, /static/*, static_app)
  27. 27. (´・ω・`) データはどうしよう
  28. 28. データベースアクセスドライバ: psycopg2ORM: SQLAlchemyマイグレーション: alembic
  29. 29. (`・ω・) 予想以上に ちゃんと動くぞ!
  30. 30. セッションBeakerBeaker自体は動くバックエンドは Memory, Fileは問題なしその他のバックエンドは依存ライブラリが対応しているか未確認
  31. 31. 認証repoze.who (trunk)多分 2.1 でリリース使いたければ setup.py の dependency_links に以下を追加https://github.com/repoze/repoze.who/zipball/master#egg=repoze.who-2.1dev
  32. 32. フォームライブラリdeformcolander問題なく利用可能。っていうか僕が対応しました(・∀・)
  33. 33. 画像処理pillow はよ
  34. 34. (´・ω・`) PILとかは 非公式パッチで動くらしいですねぇ
  35. 35.        |   \  __  /   _ (m) _ピコーン      |ミ|    /  `´  \     (A`)     ノヽノヽ       くく
  36. 36. 画像処理PyQtにQImageがあるじゃないか!
  37. 37. PyQt説明しよう!PyQtとは!UNIX系のデスクトップ環境KDEで採用されていることで有名なGUIツールキットQtのPythonバインディングである!つまり!画像をリサイズするためだけに、GUIツールキットを使おうとしているのである!
  38. 38. (゚д゚ )
  39. 39. ( ゚д゚ )
  40. 40. QImageを使うためにQImageがQtGUIモジュールにあるため、ヘッドレス不可能LinuxだったらX11が必要になりますQtをインストールPyQtをインストール
  41. 41. ファイルアップロードからのサムネイル保存data = validated[image][fp].read()image = QtGui.QImage.fromData(data)thumbnail = image.scaled(128, 128, aspectRatioMode=Qt.KeepAspectRatio)thumbnail.save(thumbnail_filename)
  42. 42. まとめ画像処理だけ難あり?他は結構でそろっているが、実際にはフレームワークを使うことになるでしょう。
  43. 43. つまり、Django待ち
  44. 44. 参考● 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/

×