这是来自我不久前写的blog post。使用 webob 和粘贴。 TransparentProxy 将请求转发到请求指定的任何 url。您可以编写中间件来处理请求,然后再将其交给透明代理。
然后只需将您的浏览器代理设置设置为您的代理运行的任何地址。
此示例打印请求和响应,对于您的情况,您想要检查 404 或 302 或其他任何内容的响应状态并发送到您编写的代码。
from webob.dec import wsgify
from paste import httpserver
from paste.proxy import TransparentProxy
def print_trip(request, response):
"""
just prints the request and response
"""
print "Request\n==========\n\n"
print str(request)
print "\n\n"
print "Response\n==========\n\n"
print str(response)
print "\n\n"
class HTTPMiddleware(object):
"""
serializes every request and response
"""
def __init__(self, app, record_func=print_trip):
self._app = app
self._record = record_func
@wsgify
def __call__(self, req):
result = req.get_response(self._app)
try:
self._record(req.copy(), result.copy())
except Exception, ex: #return response at all costs
print ex
return result
httpserver.serve(HTTPMiddleware(TransparentProxy()), "0.0.0.0", port=8088)
编辑:
这是我编写的中间件示例,因此我可以截取路径并返回不同的响应。我用它来测试一个为生产而硬编码的 javascript 繁重的应用程序,我截取 config.js 并输出我自己的,它具有 unittest 特定的设置。
class FileIntercept(object):
"""
wsgi: middleware
given request.path will call wsgi app matching that path instead
of dispatching to the wrapped application
"""
def __init__(self, app, file_intercept={}):
self._app = app
self._f = file_intercept
def __call__(self, environ, start_response):
request = Request(environ)
if request.path.lower() in self._f:
response = request.get_response(self._f[request.path.lower()])
else:
response = request.get_response(self._app)
return response(environ, start_response)
作为一个例子,我会像这样初始化它......
app = FileIntercept(TransparentProxy(),
file_intercept={"/js/config.js":Response("/*new settings*/")})
httpserver.serve(HTTPMiddleware(app), "0.0.0.0", port=8088)