【问题标题】:Python: Serving a BaseHTTPRequestHandler via WSGIPython:通过 WSGI 提供 BaseHTTPRequestHandler
【发布时间】:2014-01-06 02:35:44
【问题描述】:

我正在考虑运行一个小型 Python webapp,它作为 BaseHTTPRequestHandler 的实现(即 https://github.com/openid/python-openid/blob/master/examples/server.py)。 我想使用现有的 WSGI 服务器,即带有 mod_wsgi 的 Apache。

所以我的问题是:如何通过 WSGI 方便地为 BaseHTTPRequestHandler 提供服务,以便我可以将它与 Apache + mod_wsgi 挂钩?

【问题讨论】:

    标签: python wsgi basehttprequesthandler


    【解决方案1】:

    不要尝试,即使您尝试过并且能够以某种方式使其发挥作用,它也可能是一个巨大的黑客攻击。

    尝试找到已经在 WSGI 服务器上运行的应用程序版本。

    如果你需要一个非常小的 WSGI 服务器,它只依赖于标准 Python 发行版中的东西,那么请使用 wsgiref 模块中的 WSGI 服务器。

    如果您需要一个简单易用的 WSGI 框架,并尝试移植该应用程序,请使用 Flask。

    【讨论】:

      【解决方案2】:

      如果你的BaseHTTPRequestHandler很简单,可以试试warp到wsgi应用,参考SVNOnline.wsgi

      """
      wsgi.py
      WSGI warp
      """
      
      import os
      import wsgiref.util
      
      try:
          from cStringIO import StringIO
      except ImportError:
          from StringIO import StringIO
      
      class HeadsWarp(object):
          environ = None
          def __init__(self, environ):
              self.environ = environ
          def getheader(self, name):
              name = name.upper().replace('-', '_')
              return self.environ.get('HTTP_%s' % (name), self.environ.get(name))
      
      class WSGIHandler(YourHTTPRequestHandler):
          path = None
          headers = None
      
          response_code = 200
          response_message = 'OK'
          request_version = 'HTTP/1.0'
          response_headermap = {
                                'Content-Type':'text/html'
                                }
      
          def __init__(self, request, client_address, server):
              self.request = request
              self.client_address = client_address
              self.server = server
              self.setup()
              try:
                  self.handle()
              finally:
                  self.finish()
      
          def setup(self):
              pass
      
          def finish(self):
              pass
      
          def handle(self):
              pass
      
          def handle_one_request(self):
              pass
      
          def send_response(self, code, message=None):
              self.response_code = code
              self.response_message = message
      
          def send_header(self, keyword, value):
              self.response_headermap[keyword] = value
      
          @property
          def response_headers(self):
              return self.response_headermap.items()
      
      def application(environ, start_response):    
          handler = WSGIHandler(None, (environ['REMOTE_ADDR'], None), None)
      #     for k, v in environ.items():
      #         print k, v
          handler.path = environ['PATH_INFO'] + ('?' + environ['QUERY_STRING'] if environ['QUERY_STRING'] else '')
          handler.rfile = environ['wsgi.input']
          handler.headers = HeadsWarp(environ)
          handler.wfile = StringIO()
          handler.request_version = environ['SERVER_PROTOCOL']
          handler.command = environ['REQUEST_METHOD']
          method = 'do_%s' % (environ['REQUEST_METHOD'])
          if hasattr(handler, method):
              handler_method = getattr(handler, method)
              handler_method()
          handler.wfile.seek(0)
          res = handler.wfile.read()[2:]
          if res.startswith('\n\n'):
              res = res[2:]
          if res:
              handler.send_header("Content-Length", str(len(res)))
      
          status = '%s %s' % (handler.response_code or 200, handler.response_message or 'OK')
          headers = [(k, v) for k, v in handler.response_headers if not wsgiref.util.is_hop_by_hop(k)]
      
          start_response(status, headers)
      
      
      
          return [res, ]
      

      然后使用gunicorn -b 0.0.0.0:8000 wsgi:application进行测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-09
        • 2016-12-17
        • 2012-08-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        相关资源
        最近更新 更多