【问题标题】:Having problems outputting proper CGI, Python script?输出正确的 CGI、Python 脚本时遇到问题?
【发布时间】:2017-12-09 14:49:04
【问题描述】:

所以我试图让我的项目尽可能简单,因此我决定在我的 Python 脚本中使用 CGI 来运行执行某些操作的程序。

这是我目前的设置:

在 CMD 中,我运行: python -m http.server --cgi 8000

这为我启动了一个服务器。我可以通过localhost:8000 访问它。

接下来,我尝试通过输入脚本所在的实际地址来查找我的目录:localhost:8000/test/cgi-bin/test.py

这是给我实际文件的输出,而不是真正正确地读取它。我尝试了 2 种不同的方式在 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 包和依赖项,因为我的工作非常谨慎。

非常感谢任何帮助。

【问题讨论】:

    标签: python server cgi


    【解决方案1】:

    首先,我想说,在 2017 年编写纯 CGI 脚本是一种勇敢的人的方式。如果您使用bottle 或烧瓶,您的生活会轻松很多。

    但如果你愿意,这里是你可以开始的方式。

    1. python -m http.server --cgi 假定 cgi-bin 在当前目录中。也就是说,您应该转到test 目录并从那里启动命令。然后拨打http://localhost:8000/cgi-bin/test.py

    2. 您的 cgi 脚本不正确。该脚本应该是可执行的。我不确定在 Windows 中运行 http.server 时是否需要 shebang 行,但在 Windows 下使用 Apache Web 服务器运行 CGI 脚本时需要。 shebang 行以#! 开头,然后包含python3 解释器的完整路径,并且该行应以\n 而不是\r\n 结尾,否则将不起作用。

      之后,您应该输出所有 HTTP 标头,打印一个空行,然后输出您的内容。所有 HTTP 标头都应该用 '\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>')    
    

    【讨论】:

    • http.server 不假定 cgi-bin 是当前目录。相反,它假定 CGI 脚本将放在名为 /cgi-bin 的子文件夹中(或根据文档为 /htbin)。这就是为什么他要么必须将他的 CGI scipts 移动到 /cgi-bin 子文件夹中,要么将 /test 添加到 cgi_directories 变量中。
    【解决方案2】:

    我认为脚本的第一行需要指定解释器路径。一些例子是:

    #!/usr/bin/python
    #!/usr/bin/python2.3
    #!/usr/bin/python2.4
    #!c:\Python24\python.exe
    #!c:\Python25\python.exe
    

    看看有没有帮助。

    【讨论】:

    • 这是什么意思?
    • 那么,找到我的 Python 所在的位置,然后把它写在上面?
    • 所以,我将 Python 的路径添加到代码中,但我收到一条错误消息:Error response Error code: 404 Message: File not found. Error code explanation: HTTPStatus.NOT_FOUND - Nothing matches the given URI. 在我的浏览器中。
    • 这是我的路径:#!C:\Users\BregmanM\AppData\Local\Programs\Python\Python36-32\python.exe
    • 现在我重新运行它,它仍然只是输出文件中的确切代码。
    【解决方案3】:

    根据http.server documentation:

    这默认为 ['/cgi-bin', '/htbin'] 并描述被视为包含 CGI 脚本的目录。

    因此,http.server 期望在您的 python.exe 文件夹中名为 /cgi-bin/htbin 的子文件夹中找到 CGI 脚本。如果你真的想使用 test 文件夹,那么在 http/server.py 脚本中更改 cgi-directories 变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2017-04-24
      • 2012-07-06
      • 1970-01-01
      相关资源
      最近更新 更多