为什么在从`public_html`运行CGI时遇到500错误,当它与python CGI服务器一起使用时?

时间:2012-03-18 10:14:32

标签: python cgi

  

摘要: Python cgi脚本在从简单的python调试服务器调用时按预期运行,但从500 Premature end of script headers

运行时失败并出现~/public_html/cgi-bin/错误

问题

我的CGI脚本在通过一个简单的python web服务器运行时工作正常,导航到nameofmyhost.com:8080/...

时看到正确的输出

但是,从我的public_html/cgi-bin目录运行相同的脚本时,它会出现500 premature end of script headers错误。我该怎么做才能解决这个问题?

该文件的权限似乎没问题:

drwxrwxrwx   cgi-bin
-rwxr-xr-x   cgi-bin/generate_list.py

这是simple_httpd.py,简单的python webserver

from http.server import HTTPServer, CGIHTTPRequestHandler

port = 8080

httpd = HTTPServer(('', port), CGIHTTPRequestHandler)
print("Starting simple_httpd on port: " + str(httpd.server_port))
httpd.serve_forever()

CGI脚本generate_list.py:

#! /usr/local/bin/python3
import athletemodel
import yate
import glob

data_files = glob.glob("data/*.txt")
athletes = athletemodel.put_to_store(data_files)

print(yate.start_response())
print(yate.include_header("Coach Kelly's List of Athletes"))
print(yate.start_form("generate_timing_data.py"))
print(yate.para("Select an athlete from the list to work with:"))

for each_athlete in athletes:
    print(yate.radio_button("which_athlete", athletes[each_athlete].name))
print (yate.end_form("Select"))

print(yate.include_footer({"Home": "/index.html"}))

我猜我可能需要在某处明确说出我的目录,也许?

PS:我正在阅读Oreilly撰写的Head First Python书籍

调试步骤

  1. 检查服务器是否可以找到我的文件

    服务器在public_home找到简单的html文件 [确定]

  2. 检查CGI脚本是否可以正常执行。

        Content-type: text/html 
    
        <html> 
        <head> 
        <title>Coach Kelly's List of Athletes</title>
        [...]
    

    CGI脚本从命令行运行 - 按预期输出 [确定]

  3. 检查服务器是否可以在同一位置执行简单的CGI脚本

    尝试使用简单的CGI脚本来查看服务器是否能够执行任何

        #!/usr/local/bin/python3
        print("Content-Type; text/html")
        print("")
        print("<html><body><h1>hello</h1></body></html>")
    

    服务器无法执行简单的CGI脚本,出现相同的错误 [FAIL]

  4. 修复

    修复1:将数据路径更改为绝对数据路径而不是相对路径:

    - data_files = glob.glob("data/*.txt")
    + data_files = glob.glob("/home/delliott/public_html/webapp/data/*.txt")
    

1 个答案:

答案 0 :(得分:0)

问题是学校网络服务器的基础与simple_httpd.py服务器的基础不同。这意味着您必须提供数据目录的绝对路径而不是相对路径。

更改以下行:

- data_files = glob.glob("data/*.txt")
+ data_files = glob.glob("/home/<username>/public_html/data/*.txt")

现在应该按预期行事(如果我正确理解你的问题。)

[编辑]:检查cgi-bin脚本是否有效的快速方法是从命令行运行它们。登录到您的学校服务器并尝试自己的cgi脚本:

$ cd /home/<username>/public_html/
$ python3 my_cgi_script.py

这应该打印出你期望的html或堆栈跟踪。