Проблемы с форматированием валюты с помощью Python (Django)
У меня есть следующий код в Django:
import locale
locale.setlocale( locale.LC_ALL, '' )
def format_currency(i):
return locale.currency(float(i), grouping=True)
Он работает на некоторых компьютерах в режиме dev, но как только я пытаюсь развернуть его на производстве, я получаю эту ошибку:
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'
Я не понимаю. i
Ответы
Ответ 1
На рабочем сервере попробуйте
locale.setlocale( locale.LC_ALL, 'en_CA.UTF-8' )
вместо
locale.setlocale( locale.LC_ALL, '' )
Когда вы используете ''
, языковой стандарт устанавливается на пользовательский по умолчанию (обычно указанный переменной среды LANG
). На производственном сервере это выглядит как "C", а в качестве тестового пользователя оно выглядит как "en_CA.UTF-8".
Ответ 2
У меня возникла аналогичная проблема, когда я запускаю приложение Django через PyCharm (IDE на базе JetBrain IDEA 12), он получал ту же проблему
Форматирование валюты невозможно с использованием локали "C".
когда он работал нормально, тогда работает python manage.py runserver
будет работать нормально. После некоторого рытья я нашел обсуждение потока о переменной окружения LC_ALL
здесь
И оказалось, что если вы отредактируете "Запустить конфигурацию" и добавите переменную среды, она будет работать нормально. См. Снимок экрана ниже. Надеюсь, это поможет другим, кто сталкивается с одной и той же проблемой.
![Locale Setting Environment Variable]()
Ответ 3
http://docs.python.org/library/locale.html#locale.setlocale говорит, что он не является потокобезопасным, что не должно быть проблемой при запуске dev-сервера, но может вызвать проблемы запускать его на производственном сервере в многопоточной среде!
Ответ 4
Я знаю, что это старый, но у меня была эта проблема, и я смог продолжать использовать:
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 и получаете эту ошибку, вам просто нужно обновить .bash_profile или .profile пользователя, запускающего приложение webserver или python, добавьте две вышеуказанные строки в профиль bash и перезапустите сеанс терминала, запустите сервер и вуаля.
Надеюсь, это поможет кому-то.
Ответ 5
У меня была такая же проблема. Он работал в оболочке (оболочка manage.py), но не от MVT. Мне пришлось использовать locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
, потому что, по-видимому, у меня не было языкового стандарта en_CA.UTF-8
. Обратите внимание на en_US...
, а не на en_CA
. Просто хотел добавить ответ, потому что он снова поймал меня после перестройки и должен был найти комментарий, чтобы исправить его.
Ответ 6
Я получаю то же сообщение об ошибке, используя Djano, Nginx и uwsgi. Чтобы окружение, в отличие от просто Django, использовало правильную локаль, мне нужно было добавить строку в wsgi.py:
wsgi.py
os.environ['LC_ALL'] = "en_GB.UTF-8"
(Примечание: в моем случае я использовал британское, а не американское форматирование валюты, поэтому использовал _GB. Для вступления изменений в силу может потребоваться перезапуск соответствующих служб)