此问题来自this one。
我想要的是当用户点击按钮时能够从我的python脚本返回HTTP 303
标题。我的脚本非常简单,就输出而言,仅打印以下两行:
print "HTTP/1.1 303 See Other\n\n"
print "Location: http://192.168.1.109\n\n"
我也尝试过上述的许多不同变体(在行尾有不同数量的\r
和\n
),但没有成功;到目前为止,我总是得到Internal Server Error
。
以上两行是否足以发送HTTP 303
响应?应该还有什么吗?
答案 0 :(得分:1)
以下示例应重定向到同一页面。该示例不会尝试解析标头,检查POST发送的内容,只是在检测到POST时重定向到页面'/'
。
# python 3 import below:
# from http.server import HTTPServer, BaseHTTPRequestHandler
# python 2 import below:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import cgi
#stuff ...
class WebServerHandler(BaseHTTPRequestHandler):
def do_GET(self):
try:
if self.path.endswith("/"):
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
page ='''<html>
<body>
<form action="/" method="POST">
<input type="submit" value="Reload" >
</form>
</body>
</html'''
self.wfile.write(page)
except IOError:
self.send_error(404, "File Not Found {}".format(self.path))
def do_POST(self):
self.send_response(303)
self.send_header('Content-type', 'text/html')
self.send_header('Location', '/') #This will navigate to the original page
self.end_headers()
def main():
try:
port = 8080
server = HTTPServer(('', port), WebServerHandler)
print("Web server is running on port {}".format(port))
server.serve_forever()
except KeyboardInterrupt:
print("^C entered, stopping web server...")
server.socket.close()
if __name__ == '__main__':
main()
答案 1 :(得分:0)
通常,浏览器喜欢在HTTP响应结束时看到/r/n/r/n
。
答案 2 :(得分:0)
请注意Python自动执行的操作。 例如,在Python 3中,print函数将行尾添加到每个打印中,这可能会混淆HTTP在每条消息之间非常特定的行尾数。 由于某些原因,您仍然需要内容类型标题。
这在Apache 2上的Python 3中对我有用。
print('Status: 303 See Other')
print('Location: /foo')
print('Content-type:text/plain')
print()