首页 > 解决方案 > Python:cgi.FieldStorage.getvalue("D1") 对除 print 之外的 *everything* 产生 None 值

问题描述

我正在尝试制作一个菜单表单,它使用下拉菜单(此处称为 D1 )从多个页面中进行选择。D1 的选定值通过 HTTP POST 发送到 Python 脚本(它必须支持非常旧且速度较慢的设备,所以我不能使用 JS)将用户重定向到他们选择的页面。

#!C:/python36-32/python
import cgi
import cgitb
cgitb.enable()
print("Content-type: text/html")
print()
print("<html><head>")
print("")
url = cgi.FieldStorage().getvalue("D1")
#url = url + ".htm"
#print("""<meta http-equiv=\"refresh\" content=\"0\";url=\""""+url+"""\" /> """)
print("</head><body>")
print("<center>Redirection</center>")
print(url)
#for i in range len(url):
    #test[i] = url[i]
    print url


print(url[0])
print(url[1])
print(url[2])
#print("""<a href='"""+url+"""'>Click here if you are not redirected.</A>""")
#print(cgi.FieldStorage())

正如你所看到的,我一直在评论这段代码的行并尝试看看我是否可以让它工作,但我没有运气。

Print 将“url”变量中的输出视为字符串,但根据 cgitb 转储的错误消息,所有其他命令似乎都认为它是 NoneType。我需要做什么来解决这个问题?

编辑:这是我的 HTML 代码

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<title>TOMROW</title>
</head>

<body bgcolor="#6699FF">

<form method="POST" target="_top" enctype="application/x-www-form-urlencoded"action="toolbar.py">

    <table style="position=absolute; top=0px; width:100%;" bordercolorlight="#FFFFFF" bordercolordark="#000000" border="3">
        <tr>
            <td height="34" width="432"><font face="Courier New">&nbsp;TOMROW</font></td>
            <td height="34" width="168">
    <p align="center">
    <select name="D1">
        <option value="Login">Login</option>
        <option value="policy">Policy</option>
        <option value="links">Links</option>
        <option value="Signup">Sign Up</option>
        <option value="Videos">Videos</option>
        <option value="dload">Download</option>
        <option value="contact">Contact</option>
        <option value="games">Games</option>
        <option value="profile">Your Profile</option>

    </select>
    <input type="submit" value="Go" name="B1">
    </p></td>
        </tr>
    </table>
</form>

</body>

</html>

我为可怜的缩进道歉。

标签: pythonpython-3.xcgi

解决方案


您可以尝试查看浏览器中的开发人员工具并检查 HTTP 请求吗?POST 是多部分形式还是简单的基于 url 的参数编码?

我通常尝试使用浏览器的 REST 插件调试 cgis,并使用启用 cgi 的 python 内置 http.server:

python3 -m http.server --cgi 8000

我用基于 url 的参数做了一些简单的测试,一切都按预期工作。一些附加信息将有助于缩小问题范围。

编辑:使用您提供的 HTML 这对我有用:

#!/usr/bin/python3
import cgitb
import cgi
import os
cgitb.enable()

form = cgi.FieldStorage()
page= form.getvalue("D1")
base_url=os.environ["HTTP_REFERER"]
full_url=os.path.join(base_url,page)
print("Content-Type: text/html")    # HTML is following
print()                             # blank line, end of headers

print("<meta http-equiv='refresh' content='0;{page}.html'>".format(page=full_url))
#print(os.environ)
print("<TITLE>CGI script output</TITLE>")
print("<H1>This is my first CGI script</H1>")
print("This message should never been shown, just a redirect")

您确实会看到 cgi 生成的页面的闪烁,可能会尝试设置延迟和指示您正在被重定向的文本。


推荐阅读