我在Django中有以下代码:
import locale
locale.setlocale( locale.LC_ALL, '' )
def format_currency(i):
return locale.currency(float(i), grouping=True)
它在开发模式下的某些计算机上运行,但是一旦我尝试在生产模式下部署它,我就会收到此错误:
Exception Type: TemplateSyntaxError
Exception Value: Caught ValueError while rendering: Currency formatting is not possible using the 'C' locale.
Exception Location: /usr/lib/python2.6/locale.py in currency, line 240
奇怪的是,我可以在生产服务器上执行此操作,它可以正常运行:
python manage.py shell
>>> import locale
>>> locale.setlocale( locale.LC_ALL, '' )
'en_CA.UTF-8'
>>> locale.currency(1, grouping=True)
'$1.00'
我......没有得到它。我
答案 0 :(得分:25)
在生产服务器上,尝试
locale.setlocale( locale.LC_ALL, 'en_CA.UTF-8' )
而不是
locale.setlocale( locale.LC_ALL, '' )
使用''
时,语言环境设置为用户的默认值(通常由LANG
环境变量指定)。在生产服务器上,它看起来是'C',而作为测试用户,它似乎是'en_CA.UTF-8'。
答案 1 :(得分:4)
我遇到了类似的问题,我通过PyCharm运行Django应用程序(JetBrain的基于IDEA 12的IDE),它遇到了同样的问题
使用“C”语言环境无法进行货币格式化。
然后运行python manage.py runserver
它运行正常可以正常工作。经过一番挖掘后,我找到了关于环境变量LC_ALL
here
事实证明,如果您编辑“运行配置”并添加环境变量,它将正常工作。见下面的截图。希望这有助于遇到同样问题的其他人。
答案 2 :(得分:2)
http://docs.python.org/library/locale.html#locale.setlocale表示它不是线程安全的,这不应该是运行dev服务器的问题,但是可能会导致在多线程环境中在生产服务器上运行它时出现问题!
答案 3 :(得分:1)
我知道这是一个旧的,但我有这个问题,我能够继续使用:
locale.setlocale( locale.LC_ALL, '' )
因为我希望能够在Windows机器,linux机器和mac osx机器上运行此代码。 上面这行应该默认使用Windows机器,它不会使用mac或linux机器。 如果您使用apache运行生产服务器,则需要使用所需的语言环境设置运行apache服务的用户。 要做到这一点(至少在ubuntu中)转到/ etc / apache2 /并编辑" envvars"文件。 你会在那里看到它默认有这一行:
export LANG=C
这就是您收到错误的原因,请将其更改为:
export LANG=en_CA.UTF-8
export LC_ALL=en_CA.UTF-8
重启apache,你应该下雨了。
如果你没有运行apache并且你得到了那个错误,那么你只需要更新运行webserver或python应用程序的用户的.bash_profile或.profile,将以上两行添加到bash配置文件并重新启动终端会话,启动服务器并瞧。
希望这有助于某人。
答案 4 :(得分:0)
我遇到了同样的问题。它在shell(manage.py shell)中工作,但不在MVT中工作。我不得不使用locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
因为显然我没有en_CA.UTF-8
语言环境。请注意en_US...
而不是en_CA
。只是想添加答案,因为它在重建后再次抓住了我,并且必须找到评论来解决它。
答案 5 :(得分:0)
我在使用Djano,Nginx和uwsgi时收到了相同的错误消息。为了获得环境(而不是Django)以使用正确的语言环境,我必须在wsgi.py中添加一行:
wsgi.py
os.environ['LC_ALL'] = "en_GB.UTF-8"
(注意:在我的情况下,我使用的是英国而不是美国的_GB货币格式。为了使更改生效,可能需要重新启动相关服务)