输出正确的CGI,Python脚本有问题吗?

时间:2017-07-05 19:36:34

标签: python server cgi

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

所以这是我目前的设置:

在CMD中,我运行: <?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://tempuri.org/" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> <env:Body> <wsdl:authenticate> <username>user</username> <password>pwd</password> <cultureInfo>it</cultureInfo> </wsdl:authenticate> </env:Body> </env:Envelope>

这为我启动服务器。我可以通过python -m http.server --cgi 8000访问它。

接下来,我试图通过输入脚本的实际地址来找到我的目录:localhost:8000

这是给我实际文件的输出,而不是实际正确读取它。我尝试了两种不同的方法来输出Python文件中的数据,例如:

localhost:8000/test/cgi-bin/test.py

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>")

这两个导致实际代码显示在我的浏览器中。

几个问题:

  • 如何让我的服务器自动将我带到我尝试运行的文件的位置?
  • 如何让python脚本输出正确的东西?
  • 我是否正确设置了这个?

我试图避免安装任何新的依赖项并尽可能保持最小化。

我在Python3,Windows7上运行。我试图避免下载更多的pip包和依赖项,因为我的工作非常谨慎。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

首先,我想说2017年编写简单的CGI脚本是一种勇敢的方式。如果你使用bottle或烧瓶,你的生活会更容易。

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

  1. python -m http.server --cgi假设cgi-bin位于当前目录中。那就是你应该去test目录并从那里开始命令。然后拨打http://localhost:8000/cgi-bin/test.py

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

    之后,您应该输出所有HTTP标题,打印一个空行,然后输出您的内容。所有HTTP标头都应由&#39; \ r \ n&#39;分隔开来。而不是&#39; \ n&#39;。

  3. 以下是适用于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>')    
    

答案 1 :(得分:0)

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

public class FMOD_AudioRecodingDSP
{
    public static DSP_DESCRIPTION CreateDSPDesc(out FMOD_AudioRecodingDSP dspObj)
    {
        dspObj = new FMOD_AudioRecodingDSP();
        var desc = new DSP_DESCRIPTION()
        {
            name = "AudioExport".ToCharArray(),
            version = 1,
            numinputbuffers = 1,
            numoutputbuffers = 1,
            read = dspObj.ReadAudioData,
        };

        return desc;
    }

    public RESULT ReadAudioData(ref DSP_STATE dsp_state, IntPtr inbuffer, IntPtr outbuffer, uint length, int inchannels, ref int outchannels)
    {
        UnityEngine.Debug.Log("Working???");

        outbuffer = inbuffer;
        outchannels = inchannels;

        return RESULT.OK;
    }
}

看看它是否有帮助。

答案 2 :(得分:0)

根据http.server documentation:

  

默认为[&#39; / cgi-bin&#39;,&#39; / htbin&#39;]并描述要视为包含CGI脚本的目录。

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