0
How To Drink WSGI

          aodag
     twitter:@aodag
  http://blog.aodag.jp/
自己紹介

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

去年の6月から東京に。
Python Hack-a-th...
WSGI
WSGIとは?


Web
Server
Gateway
Interface
WSGIとは?
WSGI

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

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

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

...
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")])
  retu...
environ
  環境変数
  CGI変数
     HTTP_ACCEPT
     QUERY_STRING
     REQUEST_METHOD
     CONTENT_TYPE
     CONTENT_LENGTH
     P...
start_response

  レスポンスステータス
    "200 OK"
  レスポンスヘッダー
    ("Content-Type", "text/plain")
戻り値

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

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


Listライクオブジェクトでも、generatorでもよし。
ただし、遅延...
ミドルウェア

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

関数から関数呼ぶだけですから!
WSGIミドルウェア
WSGIミドルウェア

def middleware(app):
 def wrap(environ, start_response):
     # ここで前処理
     data = app(environ, start_response...
sqlalchemy transactionalミドルウェア

def transactional(session):
  def dec(app):
      def wrap(environ, start_response):
     ...
ミドルウェアを使う

@permission(role=permissions.Admin)
@transactional(session)
@wsgify
def update(req):
  session = req.environ['s...
WSGI開発の手助け
Paste
   Request, Responseオブジェクト
   Basic認証やDigest認証などの認証ミドルウェア

PasteDeploy
   setuptoolsに基づいたミドルウェアコンフィグレーション...
テンプレートエンジン

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...
Demo
Upcoming SlideShare
Loading in...5
×

How To Drink Wsgi

2,094

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,094
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
17
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "How To Drink Wsgi"

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

    Clipping is a handy way to collect important slides you want to go back to later.

×