how to drink wsgi
DESCRIPTION
TRANSCRIPT
How To Drink WSGI
aodagtwitter:@aodag
http://blog.aodag.jp/
自己紹介
去年の6月まで名古屋のWebシステム会社VISHに所属。Python Workshop東海01開催Python東海の立ち上げPython温泉に参加 (いただきます係)
去年の6月から東京に。Python Hack-a-thonに参加。#1 講師だったけど、誰もこなかった。
#2 なぜか当日講師にされる。
#3 スィーツを打ち出して企画したのにビターな野郎どもの巣窟に。
WSGI
WSGIとは?
WebServerGatewayInterface
WSGIとは?
WSGI
その昔CGIでしか動かないアプリケーション、mod_pythonを前提にしたフレームワークなどなど
フレームワークやアプリケーションを選ぶのに、利用可能なサーバーによる制限
サーバーとアプリケーションとの間に規格が必要
WSGI PEP333http://www.python.org/dev/peps/pep-0333/
WSGIサーバー
wsgiref標準ライブラリ
flupfcgi/scgi サーバー mod_wsgiapacheモジュール
Google App Engineクラウド
WSGIアプリケーション
def hello(environ, start_response): start_response("200 OK", [("Content-type", "text/plain")]) return ["Hello, world!"]
environ環境変数CGI変数
HTTP_ACCEPTQUERY_STRING REQUEST_METHODCONTENT_TYPECONTENT_LENGTHPATH_INFOSCRIPT_NAME
wsgi変数wsgi.version wsgi.inputwsgi.errorswsgi.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.bfgzopeのコンポーネントを分解した後に、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