我使用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。
答案 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
。希望我对我的问题的回答能帮助别人。