在其他文件中使用REMOTE_ADDR

-1 投票
2 回答
1966 浏览
提问于 2025-04-18 14:26
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地址作为表单的提交地址

撰写回答