apache+wsgi+python的web调试

有时你发现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']

完。

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

留言

你的邮箱是保密的 必填的信息用*表示