1

我的代码在服务器上运行时显示一些错误。我检查了服务器错误日志,但仍然不知道它的确切含义。它说脚本过早结束。现在我想调试我的代码来检查每一行代码它的作用是什么?我应该如何调试我的代码。我对此真的很陌生。

#!/usr/bin/python
import cgitb
import MySQLdb
import cgi

cgitb.enable()

form = cgi.FieldStorage()

f_name = form.getvalue('firstname', '')
l_name = form.getvalue('lastname', '')
age = form.getvalue('age', 0)
gender = form.getvalue('gender', '')

db = MySQLdb.connect("localhost", "root", "gaurav", "Info")

cursor = db.cursor()

sql =  "INSERT INTO PERSON (F_Name, L_Name, Age, Gender) VALUES ('%s',' %s',' %d',' %s')" % (f_name, l_name, age, gender)

try:
    cursor.execute(sql)
    #print "Hello !!"
    #print "no of rows inserted: %d " % cursor.rowcount
    db.commit()

except:
    db.rollback()

db.close()

print "Content-type:text/html"
print "<html>"
print "<h1>DATABASE</h1>"
print "</html>"
4

2 回答 2

2

问题是在 HTTP 中,标头必须以空行结尾。因此,不是发送一个标题行和一个 3 行正文,而是发送四个标题行,除了其中一个之外都是无意义的,然后在没有完成标题的情况下退出。

因此,服务器抱怨脚本在没有完成写入响应的情况下退出。

试试这个:

print "Content-type:text/html"
print
print "<html>"
print "<h1>DATABASE</h1>"
print "</html>"

如果您想记录每一行代码,正如您在评论中所说,有两种方法可以做到这一点。

快速而肮脏的方法是打开一个文件并write进入它。例如:

#!/usr/bin/python
import cgitb
import MySQLdb
import cgi

with open('/tmp/logfile.log', 'wb') as logfile:

    logfile.write('About to enable cgitb\n')
    cgitb.enable()

    logfile.write('About to create FieldStorage\n')
    form = cgi.FieldStorage()

    logfile.write('About to get firstname\n')
    f_name = form.getvalue('firstname', '')
    logfile.write('Firstname is {}. About to get lastname\n'.format(firstname))
    l_name = form.getvalue('lastname', '')
    logfile.write('Lastname is {}. About to get age\n'.format(lastname))
    # and so on

更简洁的方法是使用loggingPython 自带的模块:

#!/usr/bin/python
import cgitb
import MySQLdb
import cgi
import logging

logging.info('About to enable cgitb')
cgitb.enable()

logging.info('About to create FieldStorage')
form = cgi.FieldStorage()

这更简单(无需添加\n到最后,记录器可以为您格式化字符串,因此您不必手动使用.formator%等​​)。而且它更加灵活(您可以在不同级别记录不同的消息,您可以配置日志的去向——例如,将它们发送到您的系统日志而不是 /tmp 中的文件等)。而且它更健壮(无需担心忘记close文件和丢失最后的日志消息——注意在非logging示例中,我使用了一条with语句来获得相同的效果,但这需要缩进整个程序)。

如果您有时间完成Logging Tutorial,您应该这样做。


最后,如果您非常确定某行引发了异常,但您在服务器日志中的任何地方都找不到异常信息,那么记录异常的方法如下:

import traceback
try:
    the line that raises
except Exception:
    traceback.print_exc(None, logfile)
    raise

这将捕获异常,打印出与您在控制台解释器会话中获得的完全相同的详细回溯,但打印到您之前打开的日志文件而不是控制台,然后让异常正常传播。

如果您正在使用该logging模块,则可以使用它自己的内置异常日志记录,或者如果您想自定义可以使用的内容sys.exc_infotraceback.format_exception获取一个字符串(或一系列字符串)进行日志记录。

于 2013-11-12T06:21:54.043 回答
0

通过检查所有错误的可能性,我找到了一个解决方案,进口顺序在这里很重要

它应该像

import cgi
import MySQLdb

代替

import MySQLdb
import cgi
于 2013-11-12T09:14:11.613 回答