Python重定向不起作用

时间:2014-08-04 08:26:37

标签: python cgi

我正在尝试将用户重定向到我的主页。它假设像

一样简单
print "Location:http://localhost:8000/index.html"
print ""

由于某种原因,这不起作用。我在Kali Linux上运行CGIHTTPServer。我正在使用Python 2.7.3 当我尝试运行脚本时,它只是打印出来

Location:http://localhost:8000/index.html

我也尝试过使用127.0.0.1而不是localhost。它也不起作用。这是我正在尝试运行的CGI脚本

#!/usr/bin/python
import MySQLdb,cgi, os, sys
db=MySQLdb.connect(host="localhost", user="root", passwd="", db="test")
flag=False
query = db.cursor()
sys.stdout.write("Content-type: text/html\r\n\r\n")
sys.stdout.write("")
sys.stdout.write("<html><body>")
form = cgi.FieldStorage()
name = form.getvalue('temp')
passwd = form.getvalue('temp2')

if(query.execute("select * from cred where uname='"+name+"' and pass='"+passwd+"'")):
    db.commit()
    sys.stdout.write("Hello "+name)

else:
    db.commit()
    flag=True
sys.stdout.write("</body></html>")

if(flag == True):
    print "Location:http://localhost:8000/"
    print ""

2 个答案:

答案 0 :(得分:3)

这里有2个问题:

  1. 总是在开始时编写Content-Type标题加上额外换行符。您现在已经完成了所有标题,并且无法再添加更多标题。

    重定向时,只编写

  2. Location标头仅用于重定向,状态为30x HTTP响应。您需要添加Status:标头,以通知Web服务器以200以外的状态进行响应。

  3. 调整代码以解决这些问题:

    #!/usr/bin/python
    import cgitb
    cgitb.enable()
    
    import MySQLdb, cgi, os, sys
    
    db = MySQLdb.connect(host="localhost", user="root", passwd="", db="test")
    
    form = cgi.FieldStorage()
    name = form.getvalue('temp')
    passwd = form.getvalue('temp2')
    
    with db as query:
        query.execute("select * from cred where uname=%s and %s", (name, passwd))
        result = query.fetchone()
    
    if result is None:
        # no such user, redirect
        print 'Status: 302 Found'
        print 'Location: http://localhost:8000/'
        print
    
    else:
        print 'Content-type: text/html'
        print
        print '<html><body>Hello {}</body></html>'.format(name)
    

    请注意,我稍微修改了代码以使用一些最佳实践:

    1. 从不使用字符串插值将用户信息放入SQL查询中。你会受到这种SQL注入攻击的打击。使用SQL参数让数据库驱动程序为您转义值。

    2. 您可以使用连接作为上下文管理器来自动提交。

    3. 我使用字符串格式来生成HTML输出。

答案 1 :(得分:2)

如接受的答案所述,您需要Status: 302 FoundStatus: 301 Moved Permanently标题以及Location标题才能正确进行重定向。

此外,Python内置的CGIHTTPServer&#34;无法执行重定向(HTTP代码302),因为在执行CGI脚本之前会发送代码200(后面的脚本输出)。这会抢占状态代码。&#34; (https://docs.python.org/2/library/cgihttpserver.html

不幸的是,Python 3也是如此(https://docs.python.org/3/library/http.server.html#http.server.CGIHTTPRequestHandler

有一张关于它的门票(http://bugs.python.org/issue10487),但截至目前,还没有办法使用Status标头。这不应该是其他CGI服务器的问题。