【问题标题】:.cgi problem with web serverWeb服务器的.cgi问题
【发布时间】:2010-10-11 22:26:05
【问题描述】:

The code

#!/usr/bin/env python

import MySQLdb

print "Content-Type: text/html"
print 
print "<html><head><title>Books</title></head>"
print "<body>" print "<h1>Books</h1>" 
print "<ul>"

connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db') cursor = connection.cursor() cursor.execute(“SELECT name FROM books ORDER BY pub_date DESC LIMIT 10”)

for row in cursor.fetchall():
    print "<li>%s</li>" % row[0]

print "</ul>" 
print "</body></html>"

connection.close()

我将它作为 test.cgi 保存到我的网络服务器。我通过 www.mysite.com/test.cgi 运行它没有成功

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

你如何解决这个问题?

[编辑]在第一个答案之后

  1. test.cgi 是可执行的(我运行 $ chmod +x test.cgi)
  2. 我使用 Apache。
  3. 我在 .bashrc 中有这个 export PATH=${PATH}:~/bin
  4. Python 模块 MySQLdb 已安装。
  5. 代码没有智能引号。

[编辑]第二个答案后

您收到该错误是因为您 尚未安装 MySQLdb 模块 Python 需要与 MySQL 对话 数据库

我在我的系统上安装了 MySQLdb。该模块有效,因为我可以导入它们。 但是,当我访问 www.[mysite].com/test.cgi 时,我仍然遇到同样的错误。

[编辑]

我不确定这些问题

connect() 参数是否正确? MySQL 是否在 localhost 上运行 在默认端口?

我在我的服务器上运行 MySQL。关于 connect() 参数的问题与这里有关吗?

SELECT 语句是否正确?

你的意思是我的SQL语句比如SELECT语句是否正确? 我还没有使用任何 SQL 查询。 我在这里需要它们吗?

【问题讨论】:

  • 很高兴您修复了“智能引号”。这里有一些关于我刚刚偶然发现的主题的优秀读物:blogs.msdn.com/oldnewthing/archive/2009/02/25/9443404.aspx
  • @David:谢谢你的链接!你知道如何检查行尾是 LF 吗?维基百科告诉我们LF是U+000A。 Therms的建议可能是解决第二个问题的办法。

标签: python cgi


【解决方案1】:

我通过在必要时插入换行符并将智能引号替换为"' 来稍微整理一下代码。你还有以下运气吗?你可以通过输入python test.cgi从终端运行它吗?

#!/usr/bin/env python

import MySQLdb

print "Content-Type: text/html"
print
print "<html><head><title>Books</title></head>"
print "<body>"
print "<h1>Books</h1>"
print "<ul>"

connection = MySQLdb.connect(user='me', passwd='letmein', db='my_db')
cursor = connection.cursor()
cursor.execute("SELECT name FROM books ORDER BY pub_date DESC LIMIT 10")

for row in cursor.fetchall():
    print "<li>%s</li>" % row[0]

print "</ul>"
print "</body></html>"

connection.close()

【讨论】:

  • 谢谢!我把你的建议放在了这个问题上。
  • 在终端运行时收到以下错误消息:dpaste.com/8866
  • @Masi:正如其他人所说,您收到该错误消息是因为代码中有智能引号。如果您在我的答案中运行 Python 代码,您会收到哪些错误消息(如果有)?
  • Pourquoi:浏览器中的错误是一样的,而在终端中错误消息已更改dpaste.com/8977
  • @Masi:您收到该错误是因为您尚未安装 Python 需要与 MySQL 数据库通信的 MySQLdb 模块。从sourceforge.net/projects/mysql-python 下载。
【解决方案2】:

任何数量的问题都可能导致您看到的错误:

  1. test.cgi 在服务器上是否可执行 (chmod 755)?
  2. 您放置test.cgi 的目录是否指定为ScriptAlias 位置或启用了ExecCGI 选项(如果您不使用Apache,则为等效选项)?
  3. python是在系统PATH还是在Web服务器启动环境的PATH
  4. 是否安装了MySQLdb Python 库?
  5. connect() 参数是否正确? MySQL 是否在 localhost 的默认端口上运行?
  6. SELECT 语句是否正确?

如果您确定找到了python(使用最简单的脚本进行测试,或者如果可以的话,通过登录Web 服务器并输入which python),那么您可以通过将以下内容添加到脚本的顶部,就在 shebang 下方:

import cgitb
cgitb.enable()

更多详情:http://docs.python.org/library/cgitb.html

此外,如果您对 Web 服务器具有 shell 访问权限,请尝试运行 python 并输入:

>>> import MySQLdb

如果命令返回时没有错误,那么您就可以得到上面#4 的答案。如果打印错误,则需要将 MySQLdb 安装到 Web 服务器的 Python 安装中。

编辑:更仔细地查看您问题的顶部,我发现代码是从 Django Book 开头的说明性示例中提取的。因此,我可能会扩展上面的 #5 以包含警告,当然,需要在 Web 服务器可用的 MySQL 安装上设置必要的数据库、表、用户和权限。

【讨论】:

  • 答案:1. 文件是可执行文件(我运行 $ chmod +x test.cgi 2. 我还不确定 (2)。我使用 Apache。3. 我在 .bashrc 导出中有这个PATH=${PATH}:~/bin 4. 还没有 5. 不确定这个问题 6. 我还没有运行任何 SQL 命令。请你澄清一下(5)和(6)。
  • @Masi:如果未安装 MySQLdb,则 Python 脚本将在第一行(“import MySQLdb”)失败。当它失败时,它将中止,因此不会向 Apache 返回任何数据——甚至是标头。因此,您会看到错误。
  • @Masi:请在 shebang 下方添加那些“cgitb”行——然后你会在浏览器中看到一些不错的错误
  • @David:我做到了,但错误信息没有改变。我的代码现在是dpaste.com/8860
  • 在我的服务器终端运行代码时出现以下错误:dpaste.com/8866
【解决方案3】:

出现http://dpaste.com/8866/ 中的错误是因为您使用的是“弯引号”而不是标准的 ASCII 引号。

您需要将“和”替换为“。只需在文本编辑器中使用查找和替换即可。

【讨论】:

    【解决方案4】:

    确保以正确的行结尾保存文件。即 LF 仅适用于 unix,或 CR/LF 适用于 Windows。我最近遇到了完全相同的问题...

    【讨论】:

    猜你喜欢
    • 2017-07-25
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多