在其他文件中使用REMOTE_ADDR
Traceback (most recent call last):
File "./file1.py", line 47, in <module>
main(addr, name)
File "./file1.py", line 22, in main
addr = cgi.escape(os.environ["REMOTE_ADDR"])
File "/usr/lib/python2.6/UserDict.py", line 22, in __getitem__
raise KeyError(key)
KeyError: 'REMOTE_ADDR'
我在用Python编程,遇到了一个问题。
我有一个叫file1.py的文件:
import os, sys, platform, getpass, tempfile
import webbrowser
import string
import json
import cgi, cgitb
def main( addr, name):
os.environ["REMOTE_ADDR"] = addr
print os.environ ["REMOTE_ADDR"]
template = open('file2.py').read()
tmpl = string.Template(template).substitute(
name = name,
addr = cgi.escape(os.environ["REMOTE_ADDR"]),
os = user_os,
user_name = user_login,
)
f = tempfile.NamedTemporaryFile(prefix='/tmp/info.html', mode='w', delete=False)
f.write(contenu)
f.close()
webbrowser.open(f.name)
if __name__ == "__main__":
addr = sys.argv[1]
name = sys.argv[2]
user_os = sys.platform
sys.argv.append(user_os)
user_login = getpass.getuser()
sys.argv.append(user_login)
main(addr, name)
还有一个叫file2.py的文件:
<form name="sD" method="get" action="${addr}">
但是我遇到了一个错误,我尝试去解决它,但不知道该怎么做 :(
我的问题是,我不知道怎么在命令行中输入一个addr变量,然后在点击确认按钮时从URL中获取那个IP地址。
请帮帮我 :(
2 个回答
0
在你的命令行界面(也就是终端)中
$> set REMOTE_ADDR=<some url>
$> python
>>> import os
>>> print os.environ['REMOTE_ADDR']
<some url>
如果你在Python实例中定义了某个东西,它只在那个实例中可用。
但是如果你在调用任何模块之前把它放到“环境”中,它就会变得“全局可用”。
1
你的代码有几个问题。
首先,正如你在之前的问题中提到的:
你不(我再强调一次:你不)应该把客户端的IP地址作为表单的提交地址
你觉得这行代码会做什么呢?
<form name="sD" method="get" action="${addr}">
它会试图把表单发送到你用户的IP地址。这会失败。失败的原因是:
- 他们可能没有运行任何网页服务器
- 即使有,他们也可能没有写好处理你表单的脚本
- 你应该把表单提交到你自己控制的页面,这样你才能处理它
至于你缺少的密钥错误,是因为你没有设置环境变量。你可以通过几种方式来做到这一点:
- 从你的Python脚本外部,使用这个命令:
set REMOTE_ADDR=<value>
。把<value>
替换成合适的值。 - 从你的Python脚本内部,使用这段代码:
记得要导入os
模块
import os
os.environ["REMOTE_ADDR"] = "value"
再次强调,value
应该是一个合适的值。
这是你想要的一个非常简单的例子:
import os, sys
def main( addr, name):
os.environ["REMOTE_ADDR"] = addr
print os.environ["REMOTE_ADDR"]
if __name__ == "__main__":
addr = sys.argv[1]
name = sys.argv[2]
main(addr, name)
这段代码的输出是:
>python test.py "address" "name"
address
>python test.py "http://www.google.com" "name"
http://www.google.com
最后,正如你在之前的问题中提到的:
你不(我再强调一次:你不)应该把客户端的IP地址作为表单的提交地址