如何从python返回HTTP 303?

时间:2016-05-25 19:21:15

标签: python python-2.7 cgi http-status-codes http-status-code-303

此问题来自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响应?应该还有什么吗?

3 个答案:

答案 0 :(得分:1)

假设您使用的是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()

答案 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()