我有一个从 BaseHTTPRequestHandler 扩展的类:
class Handler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
# send headers
self.send_response(200)
self.send_header('Content-type', 'text/html; charset=utf-8')
self.end_headers()
if re.findall(r'^/favicon.ico$', self.path) \
or re.findall(r'^/public/.*$', self.path):
pass
else:
run = Router(self.path)
data = run.run_action()
print(data)
self.wfile.write(data.encode())
def do_POST(self):
length = int(self.headers.get('Content-length', 0))
data = self.rfile.read(length).decode()
message = clean(parse_qs(data))
self.send_response(200)
self.send_header('Content-type', 'text/html; charset=utf-8')
self.end_headers()
if re.findall(r'^/favicon.ico$', self.path) \
or re.findall(r'^/public/.*$', self.path):
pass
else:
run = Router(self.path, message)
data = run.run_action()
self.wfile.write(data.encode())
def redirect(self, url):
self.send_response(302)
self.send_header('Location', url)
self.end_headers()
我想为重定向用户创建功能。例如,在提交 POST 之后。如何在此类之外调用重定向功能?
PS:我通过分析输入数据找到了一个决定。我通过以下方式对代码进行了更改:
class Handler(http.server.BaseHTTPRequestHandler):
def send_headers(self, status, content_type, value):
self.send_response(status)
self.send_header(content_type, value)
self.end_headers()
def do_GET(self):
if re.findall(r'^/favicon.ico$', self.path) \
or re.findall(r'^/public/.*$', self.path):
pass
else:
run = Router(self.path)
data = run.run_action()
uri = re.findall(r"'Location': '([\/a-z0-9-]+)'", data)
if bool(uri):
self.redirect(uri[0])
run = Router(uri[0])
data = run.run_action()
self.wfile.write(data.encode())
else:
self.send_headers(200, 'Content-type',
'text/html; charset=utf-8')
self.wfile.write(data.encode())
def do_POST(self):
length = int(self.headers.get('Content-length', 0))
data = self.rfile.read(length).decode()
message = clean(parse_qs(data))
self.send_headers(200, 'Content-type', 'text/html; charset=utf-8')
if re.findall(r'^/favicon.ico$', self.path) \
or re.findall(r'^/public/.*$', self.path):
pass
else:
run = Router(self.path, message)
data = run.run_action()
self.wfile.write(data.encode())
def redirect(self, url):
self.send_headers(302, 'Location', url)
功能重定向看起来像:
def redirect(url):
return "'Location': '{}'".format(url)
决定是有效的,但也许有人可以提供更好的方法?
注意 CGIHTTPRequestHandler 类运行的 CGI 脚本无法执行重定向(HTTP 代码 302),因为代码 200(脚本输出如下)在执行 CGI 脚本之前发送。这会抢占状态代码。