所以我试图让我的项目尽可能简单,因此我决定在我的 Python 脚本中使用 CGI 来运行一个可以执行某些操作的程序。
这是我当前的设置:
在 CMD 中,我运行:
python -m http.server --cgi 8000
这为我启动了一个服务器。我可以通过 localhost:8000 访问它。
接下来,我尝试通过输入脚本所在的实际地址来找到我的目录:localhost:8000/test/cgi-bin/test.py
这给了我实际文件的输出,而不是真正正确地读取它。我尝试了两种不同的方式在Python文件上输出数据,例如:
import sys
sys.stdout.write("Content-type: text\html \r\n\r\n")
sys.stdout.write("<html><title>Hi</title><body><p>This is a test</p></body></html>")
和
print("Content-Type: text/html\n")
print("<!doctype html><title>Hello</title><h2>hello world</h2>")
这两者都会导致实际代码显示在我的浏览器中。
几个问题:
- 如何让我的服务器自动将我带到我尝试运行的文件的位置?
- 如何让 python 脚本输出正确的内容?
- 我的设置正确吗?
我试图避免安装任何新的依赖项并使其尽可能少。
我在Python3、Windows7上运行。我试图避免下载更多的 pip 包和依赖项,因为我的工作在技术上非常谨慎。
非常感谢任何帮助。
最佳答案
首先,我想说,在 2017 年编写简单的 CGI 脚本是勇敢者的一种方式。如果您使用bottle,您的生活会更轻松。或 flask 。
但如果您愿意,可以从这里开始。
python -m http.server --cgi
假定cgi-bin
位于当前目录中。也就是说,您应该转到test
目录并从那里启动命令。然后调用http://localhost:8000/cgi-bin/test.py
。您的 cgi 脚本不正确。该脚本应该是可执行的。我不确定当您运行
http.server
时,它是否需要 Windows 中的 shebang 行,但当您在 Windows 下使用 Apache Web 服务器运行 CGI 脚本时,这是必需的。 shebang 行以#!
开头,然后包含 python3 解释器的完整路径,并且该行应以\n
结尾,而不是\r\n
,否则无法工作。之后,您应该输出所有 HTTP header ,打印一个空行,并输出您的内容。所有 HTTP header 应以“\r\n”分隔,而不是“\n”。
下面是一个在 OS X 上运行的 CGI 脚本示例:
#!/usr/bin/env python3
import sys
sys.stdout.write('Status: 200 OK\r\n')
sys.stdout.write('Content-type: text/html;charset="utf-8"\r\n\r\n')
print('<h1>Hello, world!</h1>')
关于python - 输出正确的 CGI、Python 脚本时遇到问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44934615/