2014-01-06 5 views
0

Я рассматриваю возможность запуска крошечного веб-приложения Python, которое реализуется как реализация BaseHTTPRequestHandler (т. Е. https://github.com/openid/python-openid/blob/master/examples/server.py). Я хочу использовать существующий сервер WSGI, то есть Apache с mod_wsgi.Python: обслуживание BaseHTTPRequestHandler через WSGI

Итак, мой вопрос: как удобно обслуживать BaseHTTPRequestHandler через WSGI, чтобы я мог подключить его с помощью Apache + mod_wsgi?

ответ

0

Не пытайтесь, это, вероятно, будет одним огромным взломом, даже если вы попробуете и сможете каким-то образом заставить его работать.

Попробуйте найти версию приложения, которое уже работает на сервере WSGI.

Если вам нужен очень маленький сервер WSGI, который использует только материал из стандартного дистрибутива Python, то используйте WSGI-сервер из модуля wsgiref.

Если вам нужен простой в использовании рамки WSGI, и попытаться порт это приложение, используйте флягу.

0

Если у вас BaseHTTPRequestHandler очень просто, вы можете попробовать деформировать его 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, чтобы проверить его.

Смежные вопросы