Подтвердить что ты не робот

Проблемы с форматированием валюты с помощью 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

4b9b3361

Ответ 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. Для вступления изменений в силу может потребоваться перезапуск соответствующих служб)