首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:通过WSGI提供BaseHTTPRequestHandler

Python:通过WSGI提供BaseHTTPRequestHandler
EN

Stack Overflow用户
提问于 2014-01-06 10:35:44
回答 2查看 736关注 0票数 2

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

所以我的问题是:如何通过WSGI方便地为BaseHTTPRequestHandler提供服务,以便我可以将其与Apache + mod_wsgi连接起来?

EN

回答 2

Stack Overflow用户

发布于 2014-01-06 13:00:49

不要试图,即使你尝试过并能以某种方式让它工作,它也可能是一个巨大的黑客攻击。

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

如果您需要一个非常小的WSGI服务器,它只依赖于标准Python发行版中的内容,那么可以使用wsgiref模块中的WSGI服务器。

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

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

票数 0
EN

Stack Overflow用户

发布于 2016-05-02 23:31:13

如果您BaseHTTPRequestHandler非常简单,您可以尝试将其转换为wsgi应用程序,请参阅SVNOnline.wsgi

代码语言:javascript
复制
"""
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进行测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20942040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档