how to drink wsgi

21
How To Drink WSGI aodag twitter:@aodag http://blog.aodag.jp/

Upload: atsushi-odagiri

Post on 04-Dec-2014

2.192 views

Category:

Documents


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: How To Drink Wsgi

How To Drink WSGI

aodagtwitter:@aodag

http://blog.aodag.jp/

Page 2: How To Drink Wsgi

自己紹介

去年の6月まで名古屋のWebシステム会社VISHに所属。Python Workshop東海01開催Python東海の立ち上げPython温泉に参加 (いただきます係)

去年の6月から東京に。Python Hack-a-thonに参加。#1 講師だったけど、誰もこなかった。

#2 なぜか当日講師にされる。

#3 スィーツを打ち出して企画したのにビターな野郎どもの巣窟に。

Page 3: How To Drink Wsgi

WSGI

Page 4: How To Drink Wsgi

WSGIとは?

WebServerGatewayInterface

Page 5: How To Drink Wsgi

WSGIとは?

Page 6: How To Drink Wsgi

WSGI

その昔CGIでしか動かないアプリケーション、mod_pythonを前提にしたフレームワークなどなど

フレームワークやアプリケーションを選ぶのに、利用可能なサーバーによる制限

サーバーとアプリケーションとの間に規格が必要

WSGI PEP333http://www.python.org/dev/peps/pep-0333/

Page 7: How To Drink Wsgi

WSGIサーバー

wsgiref標準ライブラリ

flupfcgi/scgi サーバー mod_wsgiapacheモジュール

Google App Engineクラウド

Page 8: How To Drink Wsgi

WSGIアプリケーション

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

Page 9: How To Drink Wsgi

environ環境変数CGI変数

HTTP_ACCEPTQUERY_STRING REQUEST_METHODCONTENT_TYPECONTENT_LENGTHPATH_INFOSCRIPT_NAME

wsgi変数wsgi.version wsgi.inputwsgi.errorswsgi.multithreaded

Page 10: How To Drink Wsgi

start_response

レスポンスステータス"200 OK"

レスポンスヘッダー("Content-Type", "text/plain")

Page 11: How To Drink Wsgi

戻り値

strを返すiterator一番簡単なのは文字列のリスト

["Hello, world!"] でも ["Hello, ", "world!"]でも同じ

Listライクオブジェクトでも、generatorでもよし。ただし、遅延評価は要注意WSGIでは、chunkedレスポンスを正式にサポートしてません。遅延させたい人はTornadoを調べてみましょう。

Page 12: How To Drink Wsgi

ミドルウェア

WSGIアプリケーションは、呼び出し可能オブジェクトWSGIアプリケーションの中からWSGIアプリケーションを呼び出してもいいよね? 関数から関数呼ぶだけですから!

Page 13: How To Drink Wsgi

WSGIミドルウェア

Page 14: How To Drink Wsgi

WSGIミドルウェア

def middleware(app): def wrap(environ, start_response): # ここで前処理 data = app(environ, start_response) # ここで後処理 return data return wrap

Page 15: How To Drink Wsgi

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

Page 16: How To Drink Wsgi

ミドルウェアを使う

@permission(role=permissions.Admin) @transactional(session)@wsgify def update(req): session = req.environ['sa.session'] a = session(model.A).query().all() #なんか操作 session.commit()

Page 17: How To Drink Wsgi

WSGI開発の手助けPaste

Request, Responseオブジェクト Basic認証やDigest認証などの認証ミドルウェア

PasteDeploy

setuptoolsに基づいたミドルウェアコンフィグレーション PasteScript

WSGIアプリケーションを起動させるコマンド  WebOb

PasteのRequest,Responseが書き直されたもの

Werkzeug可搬性の高いDjangoっぽいコンポーネント

Page 18: How To Drink Wsgi

テンプレートエンジン

Mako 速い

Tempita

シンプルGenshi

XML Jinja2

Djangoっ ぽい

Page 19: How To Drink Wsgi

WSGIを意識したフレームワーク

Pylonsほとんどの機能をコンポーネントを集めることで実現しているフレームワーク repoze.bfgzopeのコンポーネントを分解した後に、WSGIアプリケーションとして再構成したフレームワーク

Page 20: How To Drink 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()

Page 21: How To Drink Wsgi

Demo