有时你发现python脚本发生了,导致了500的服务器内部错误。导致发生了什么错误呢?怎么调试呢?
这里给出2个方法。
一. 直接输出到浏览器
这中方法最直接,直接把想查看的一些变量什么的,变成html的元素输出,让后用过浏览器访问对应的页面就能看到了。
二. 通过wsgi.errors输出到apache的log
mod_wsgi提供了一个输出log信息到apache的方法, 示例如下:
print >> environ['wsgi.errors'], 'this is simple debug info'
上面这行代码就是将‘ this is simple debug info’输出到apache的error.log文件。为了知道environ是什么,我们先看看python脚本和wsgi交互的接口。
def application(environ, start_response): status = '200 OK' print >> environ['wsgi.errors'], environ output='<html><head></head><body>' + '<br>' + '<pre>' + ' You successfull submit your information' + '</pre>' + '</body></html>' response_headers = [('Content-type', 'text/html'), ('Content-Length', str(len(output)))] start_response(status, response_headers) return [output]
这就是一个典型的python脚本用来动态的生成html。而application(environ, start_response)就是wsgi和我们的脚本交互的接口,这里声明一下实际上wsgi不行直接去和python脚本打交道而是通过python解释器为中介的。
start_response是一个传进来的类似函数指针的东西, environ是一个数据,里面包含了很多的信息,这里看看我的测试的中envrion的值,我其实就是利用上面的第二种方法得到它的值的:
{'mod_wsgi.listener_port': '80', 'HTTP_REFERER': 'http://127.0.0.3/dynamic/app.py', 'mod_wsgi.listener_host': '', 'SERVER_SOFTWARE': 'Apache/2.2.20 (Ubuntu)', 'SCRIPT_NAME': '/dynamic/post-query.py', 'mod_wsgi.handler_script': '', 'SERVER_SIGNATURE': '<address>Apache/2.2.20 (Ubuntu) Server at 127.0.0.3 Port 80</address>\n', 'REQUEST_METHOD': 'POST', 'PATH_INFO': '', 'SERVER_PROTOCOL': 'HTTP/1.1', 'QUERY_STRING': '', 'CONTENT_LENGTH': '26', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'HTTP_USER_AGENT': 'Mozilla/5.0 (Ubuntu; X11; Linux i686; rv:9.0.1) Gecko/20100101 Firefox/9.0.1', 'HTTP_CONNECTION': 'keep-alive', 'SERVER_NAME': '127.0.0.3', 'REMOTE_ADDR': '127.0.0.1', 'mod_wsgi.request_handler': 'wsgi-script', 'wsgi.url_scheme': 'http', 'mod_wsgi.callable_object': 'application', 'SERVER_PORT': '80', 'wsgi.multiprocess': True, 'mod_wsgi.input_chunked': '0', 'SERVER_ADDR': '127.0.0.3', 'DOCUMENT_ROOT': '/var/www/test', 'mod_wsgi.process_group': '', 'SCRIPT_FILENAME': '/var/www/test/dynamic/post-query.py', 'SERVER_ADMIN': '[no address given]', 'wsgi.input': <mod_wsgi.Input object at 0x21751430>, 'HTTP_HOST': '127.0.0.3', 'wsgi.multithread': True, 'REQUEST_URI': '/dynamic/post-query.py', 'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'wsgi.version': (1, 1), 'GATEWAY_INTERFACE': 'CGI/1.1', 'wsgi.run_once': False, 'wsgi.errors': <mod_wsgi.Log object at 0x217ac750>, 'REMOTE_PORT': '58734', 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5', 'mod_wsgi.version': (3, 3), 'CONTENT_TYPE': 'application/x-www-form-urlencoded', 'mod_wsgi.application_group': '127.0.0.3|/dynamic
这里面的信息量非常大,可以根据你的需要来区,比如你想看这个request是由那个浏览器版本发过来的,你可以使用:
print >> environ['wsgi.errors'],environ['HTTP_USER_AGENT']
完。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.