2

这个问题来自this one

HTTP 303当用户单击按钮时,我想要的是能够从我的 python 脚本返回标题。我的脚本非常简单,就输出而言,它只打印以下两行:

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响应?应该有别的吗?

4

3 回答 3

2

假设您使用的是 cgi ( 2.7 )( 3.5 )

下面的示例应重定向到同一页面。该示例不会尝试解析标头,检查发送了什么 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()
于 2016-05-26T18:31:48.403 回答
0

对 Python 自动执行的操作要非常小心。例如,在 Python 3 中,print 函数为每个打印添加了行尾,这可能会混淆 HTTP 在每条消息之间非常具体的行尾数。出于某种原因,您还需要一个内容类型标头。

这在 Apache 2 上的 Python 3 中对我有用:

print('Status: 303 See Other')
print('Location: /foo')
print('Content-type:text/plain')
print()
于 2020-03-07T00:22:10.340 回答
0

通常浏览器喜欢/r/n/r/n在 HTTP 响应的末尾看到。

于 2016-05-25T20:31:35.997 回答