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

Как исправить "множественные формы могут быть опасны" ошибка django?

Я не понимаю. Если я устанавливаю заголовок Accept-Language на что-либо, кроме "en" (de, pl, es) или даже что-то, что не существует (например, xxs), приложение не выплевывает эту ошибку, но это происходит, когда я установите его в "en". Это происходит только на окнах (новейшие инструменты gettext). Здесь трассировка стека:

Traceback (most recent call last):
  File "E:\projekty\python\myapp_api\_env\lib\site-packages\django\core\han
dlers\exception.py", line 39, in inner
    response = get_response(request)
  File "E:\projekty\python\myapp_api\_env\lib\site-packages\django\core\han
dlers\base.py", line 244, in _legacy_get_response
    response = middleware_method(request)
  File "E:\projekty\python\myapp_api\_env\lib\site-packages\django\middlewa
re\locale.py", line 29, in process_request
    translation.activate(language)
  File "E:\projekty\python\myapp_api\_env\lib\site-packages\django\utils\tr
anslation\__init__.py", line 161, in activate
    return _trans.activate(language)
  File "E:\projekty\python\myapp_api\_env\lib\site-packages\django\utils\tr
anslation\trans_real.py", line 238, in activate
    _active.value = translation(language)
  File "E:\projekty\python\myapp_api\_env\lib\site-packages\django\utils\tr
anslation\trans_real.py", line 227, in translation
    _translations[language] = DjangoTranslation(language)
  File "E:\projekty\python\myapp_api\_env\lib\site-packages\django\utils\tr
anslation\trans_real.py", line 129, in __init__
    self._add_installed_apps_translations()
  File "E:\projekty\python\myapp_api\_env\lib\site-packages\django\utils\tr
anslation\trans_real.py", line 176, in _add_installed_apps_translations
    translation = self._new_gnu_trans(localedir)
  File "E:\projekty\python\myapp_api\_env\lib\site-packages\django\utils\tr
anslation\trans_real.py", line 156, in _new_gnu_trans
    fallback=use_null_fallback)
  File "C:\Python35\lib\gettext.py", line 426, in translation
    t = _translations.setdefault(key, class_(fp))
  File "C:\Python35\lib\gettext.py", line 162, in __init__
    self._parse(fp)
  File "C:\Python35\lib\gettext.py", line 297, in _parse
    self.plural = c2py(plural)
  File "C:\Python35\lib\gettext.py", line 76, in c2py
    raise ValueError('plural forms expression could be dangerous')
ValueError: plural forms expression could be dangerous

У меня plural-forms правильно настроен в моем файле django.po:

"Plural-Forms: nplurals=2; plural=(n != 1);\n"

Почему это происходит и как его исправить?

4b9b3361

Ответ 1

Я нашел ответ - причиной этой ошибки является моя некомпетентность:). Я выполнил команду django-admin makemessages в корне моего проекта, поэтому рядом с _env и всеми пакетами внутри. Эта команда создала языковые файлы для нескольких проектов с шаблоном файла django.po по умолчанию, поэтому они содержали что-то вроде plural-forms=INTEGER и других вещей, и это вызывало вышеупомянутую ошибку.

Ответ 3

Ваше множественное выражение (n != 1), скорее всего, считается опасным, потому что оно слишком инклюзивное. n doesn't equal 1 означает любое значение, кроме 1 будет оцениваться до True, включая логические значения, строки или None.

Попробуйте изменить выражение, чтобы использовать equals, больше и меньше операций, чтобы сузить область выражения.