2014-01-06 9 views
0

BaseHTTPRequestHandler (즉 https://github.com/openid/python-openid/blob/master/examples/server.py)의 구현으로 제공되는 아주 작은 Python 웹 애플리케이션을 실행할 것을 고려하고 있습니다. 기존 WSGI 서버, 즉 mod_wsgi가있는 Apache를 사용하고 싶습니다.Python : WSGI를 통한 BaseHTTPRequestHandler 서비스

내 질문은 : 편리하게 WSGI를 통해 BaseHTTPRequestHandler을 제공하여 편리하게 Apache + mod_wsgi에 연결할 수 있습니까?

답변

0

시도하지 마십시오. 시도해도 어떻게 든 작동 할 수 있다고해도 거대한 해킹 일 수 있습니다.

이미 WSGI 서버에서 작동하는 응용 프로그램의 버전을 찾으십시오.

표준 파이썬 배포본에만 의존하는 매우 작은 WSGI 서버가 필요한 경우 wsgiref 모듈의 WSGI 서버를 사용하십시오.

http://docs.python.org/2/library/wsgiref.html#module-wsgiref.simple_server

당신이 플라스크를 사용 WSGI 프레임 워크를 사용하고, 해당 응용 프로그램을 시도하고 포트에 간단하게 필요한 경우

  • . 당신 BaseHTTPRequestHandler은 매우 간단 경우

0

, 당신은 SVNOnline.wsgi를 참조 응용 프로그램을 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를 사용합니다.