Pthon WSGI心得

python web眾多有django、web.py、Tornado 、Pylons...
這麼多的框架學哪一個呢?我想與其隻了解一些眾多框架表面的使用技巧
還不如深入了解某一框架的核心, 所以就從最簡單的web.py開始吧,
看了一下web.py源代碼,發現要深入了解web.py還得從WSGI開始
所以花了幾天的的時間深入了解了一下WSGI


WSGI是什麼
WSGI(Web Server Gateway Interface)是一種規范
參見PEP 333 http://www.python.org/dev/peps/pep-0333/


WSGI Server有哪些
比如 Django、CherryPy 都自带 WSGI server 主要是测试用途, 发布时则使用生产环境的 WSGI server
而有些 WSGI 下的框架比如 pylons、bfg 等, 自己不实现 WSGI server。使用 paste 作为 WSGI server
CherryPy's WSGI server.

Python自帶的 wsgiref

WSGI application

一个接口与两个参数

application(environ, start_response)

Demo

#! /usr/bin/env python

# Our tutorial's WSGI server
from wsgiref.simple_server import make_server

def application(environ, start_response):

   # Sorting and stringifying the environment key, value pairs
   response_body = ['%s: %s' % (key, value)
                    for key, value in sorted(environ.items())]
   response_body = '\n'.join(response_body)

   status = '200 OK'
   response_headers = [('Content-Type', 'text/plain'),
                  ('Content-Length', str(len(response_body)))]
   start_response(status, response_headers)

   return [response_body]

# Instantiate the WSGI server.
# It will receive the request, pass it to the application
# and send the application's response to the client
httpd = make_server(
   'localhost', # The host name.
   8051, # A port number where to wait for the request.
   application # Our application object name, in this case a function.
   )

httpd.serve_forever()


wsgiref的simple_server說明
server的主要作用是接受client的請求,並把的收到的請求交給RequestHandlerClass處理,
RequestHandlerClass處理完成後回傳結果給client

WSGIServer繼承關系
WSGIServer-->HTTPServer-->SocketServer.TCPServer-->BaseServer
主要處理流程
serve_forever
  _handle_request_noblock()
    process_request
      finish_request--> RequestHandlerClass()
      close_request

serve_forever循環接受client請求, 如果有請求來,
經finish_request方法把請求交給RequestHandlerClass處理,
RequestHandlerClass調用handle()方法處理request,
WSGIRequestHandler的handle()方法把request又交給ServerHandler處理,
ServerHandler調用run執行application方法, 回傳綱頁的結果(含http header及綱頁內容)給client

WSGIRequestHandler繼承關系
WSGIRequestHandler-->BaseHTTPRequestHandler-->StreamRequestHandler-->BaseRequestHandler

BaseRequestHandler主要方法及處理流程
1、setup()
2、handle()
3、finish()

WSGIRequestHandler主要方法及處理流程
1、get_environ 增加env
2、handle (override)
        handler = ServerHandler
        handler.run(self.server.get_app())

ServerHandler繼承關系
ServerHandler-->SimpleHandler-->BaseHandler
run方法
  setup_environ
  self.result = application(self.environ, self.start_response)
  self.finish_response



  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值