为什么parse_qs会根据wsgi应用程序的启动方式给出不同的结果?

时间:2014-08-06 14:24:59

标签: python apache python-3.x mod-wsgi wsgi

我使用Python 3.2.5和Oracle Linux 6.4。我编写了我的wsgi应用程序,但是我遇到了一些问题:函数urllib.parse.parse_qs的行为有所不同,具体取决于我启动应用程序的方式(Apache使用mod_wsgi或wsgiref.simple_server)。在我的application函数中,我有以下代码:

def application(environ, start_response):
    print(environ["QUERY_STRING"])
    requestParams = parse_qs(environ["QUERY_STRING"])
    print(requestParams)
    .......

因此。当我使用wsgiref.simple_server启动我的程序并进行查询/query?name=Иван(它是俄语名称)时,我得到以下输出:

name=%D0%98%D0%B2%D0%B0%D0%BD
{'name': ['Иван']}

但我使用Apache + mod_wsgi的应用程序给出了以下内容:

name=%D0%98%D0%B2%D0%B0%D0%BD
{'name': ['\xd0\x98\xd0\xb2\xd0\xb0\xd0\xbd']}

正如你所看到的,后者并没有给我正确的UTF-8编码的俄语单词,尽管函数的输入是相同的。根据{{​​3}}函数,parse_qs具有默认参数encoding ='utf-8'。结果我在进一步的工作中遇到了其他问题。我无法理解为什么这个函数的工作方式不同。

我有以下Apache虚拟主机:

<VirtualHost *:80>
    DocumentRoot /var/www/my_project
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/my_project/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>
    WSGIDaemonProcess my_project processes=8 threads=1 python-path=/var/www/my_project display-name=%{GROUP}
    WSGIProcessGroup my_project
    WSGIScriptAlias /my_project /var/www/my_project/my_project.py
</VirtualHost>

我的apache使用prefork MPM。

1 个答案:

答案 0 :(得分:0)

Graham Dumpleton(mod_wsgi的开发人员之一)建议我在lang=en_US.UTF-8 locale=en_US.UTF-8指令中使用WSGIDaemonProcess。虽然python的print函数没有打印正确的字符串,但是这些选项没有在文档中描述,但它们帮助我克服了字符串的问题。它仍然在Apache日志中打印\xd0\x98\xd0\xb2\xd0\xb0\xd0\xbd。但写入文件效果很好。因此,我可以假设这是因为我的python脚本没有为Apache + mod_wsgi启动环境变量PYTHONIOENCODING。希望我对我的问题的回答能帮助别人。