How To Drink Wsgi
Upcoming SlideShare
Loading in...5
×
 

How To Drink Wsgi

on

  • 2,085 views

 

Statistics

Views

Total Views
2,085
Views on SlideShare
2,081
Embed Views
4

Actions

Likes
0
Downloads
16
Comments
0

1 Embed 4

http://www.slideshare.net 4

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

How To Drink Wsgi How To Drink Wsgi Presentation Transcript

  • How To Drink WSGI aodag twitter:@aodag http://blog.aodag.jp/
  • 自己紹介 去年の6月まで名古屋のWebシステム会社VISHに所属。 Python Workshop東海01開催 Python東海の立ち上げ Python温泉に参加 (いただきます係) 去年の6月から東京に。 Python Hack-a-thonに参加。 #1 講師だったけど、誰もこなかった。 #2 なぜか当日講師にされる。 #3 スィーツを打ち出して企画したのに ビターな野郎どもの巣窟に。
  • WSGI
  • WSGIとは? Web Server Gateway Interface
  • WSGIとは?
  • WSGI その昔 CGIでしか動かないアプリケーション、mod_pythonを前提にしたフ レームワークなどなど フレームワークやアプリケーションを選ぶのに、 利用可能なサーバーによる制限 サーバーとアプリケーションとの間に規格が必要 WSGI PEP333 http://www.python.org/dev/peps/pep-0333/
  • WSGIサーバー wsgiref 標準ライブラリ flup fcgi/scgi サーバー mod_wsgi apacheモジュール Google App Engine クラウド
  • WSGIアプリケーション def hello(environ, start_response): start_response("200 OK", [("Content-type", "text/plain")]) return ["Hello, world!"]
  • environ 環境変数 CGI変数 HTTP_ACCEPT QUERY_STRING REQUEST_METHOD CONTENT_TYPE CONTENT_LENGTH PATH_INFO SCRIPT_NAME wsgi変数 wsgi.version wsgi.input wsgi.errors wsgi.multithreaded
  • start_response レスポンスステータス "200 OK" レスポンスヘッダー ("Content-Type", "text/plain")
  • 戻り値 strを返すiterator 一番簡単なのは文字列のリスト ["Hello, world!"] でも ["Hello, ", "world!"]でも同じ Listライクオブジェクトでも、generatorでもよし。 ただし、遅延評価は要注意 WSGIでは、chunkedレスポンスを正式にサポートしてません。 遅延させたい人はTornadoを調べてみましょう。
  • ミドルウェア WSGIアプリケーションは、呼び出し可能オブジェクト WSGIアプリケーションの中からWSGIアプリケーションを呼び出して もいいよね? 関数から関数呼ぶだけですから!
  • WSGIミドルウェア
  • WSGIミドルウェア def middleware(app): def wrap(environ, start_response): # ここで前処理 data = app(environ, start_response) # ここで後処理 return data return wrap
  • sqlalchemy transactionalミドルウェア def transactional(session): def dec(app): def wrap(environ, start_response): environ["sa.session"] = session try: data = app(environ, start_response) session.commit() return data finally: session.remove() return wrap return dec
  • ミドルウェアを使う @permission(role=permissions.Admin) @transactional(session) @wsgify def update(req): session = req.environ['sa.session'] a = session(model.A).query().all() #なんか操作 session.commit()
  • WSGI開発の手助け Paste Request, Responseオブジェクト Basic認証やDigest認証などの認証ミドルウェア PasteDeploy setuptoolsに基づいたミドルウェアコンフィグレーション PasteScript WSGIアプリケーションを起動させるコマンド  WebOb PasteのRequest,Responseが書き直されたもの Werkzeug 可搬性の高いDjangoっぽいコンポーネント
  • テンプレートエンジン Mako 速い Tempita シンプル Genshi XML Jinja2 Djangoっ ぽい
  • WSGIを意識したフレームワーク Pylons ほとんどの機能をコンポーネントを集めることで実現しているフレー ムワーク repoze.bfg zopeのコンポーネントを分解した後に、WSGIアプリケーションとして 再構成したフレームワーク
  • WSGIRef from wsgiref.simple_server import make_server def application(environ, start_response): start_response("200 OK", [("Content-type", "text/plain")]) return ["Hello, world!"] httpd = make_server('', 8000, application) httpd.serve_forever()
  • Demo