Обновление до Django 1.7: Получение AppRegistryNotReady для инфраструктуры перевода

Я обновляюсь с Django 1.6 до 1.7, и когда я пытаюсь сделать manage.py runserver, я получаю следующую трассировку:

Traceback (most recent call last):
  File "manage.py", line 9, in <module>
    execute_from_command_line(sys.argv)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute
    django.setup()
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/apps/config.py", line 87, in create
    module = import_module(entry)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/ben/Code/Repos/myrepo/myproject/core/mail/__init__.py", line 6, in <module>
    from myproject.core.mail.models import IMapEmailMessage, EmailStatus
  File "/home/ben/Code/Repos/myrepo/myproject/core/mail/models.py", line 20, in <module>
    from myproject.core.mail.utils import render_templates
  File "/home/ben/Code/Repos/myrepo/myproject/core/mail/utils.py", line 19, in <module>
    from myproject.core.util import clean_html
  File "/home/ben/Code/Repos/myrepo/myproject/core/util.py", line 1031, in <module>
    def make_url(url, text=_('here')):
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 83, in ugettext
    return _trans.ugettext(message)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 325, in ugettext
    return do_translate(message, 'ugettext')
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 306, in do_translate
    _default = translation(settings.LANGUAGE_CODE)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 209, in translation
    default_translation = _fetch(settings.LANGUAGE_CODE)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 189, in _fetch
    "The translation infrastructure cannot be initialized before the "
django.core.exceptions.AppRegistryNotReady: The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time.

Раньше я не использовал реестр приложений, поэтому я предполагаю, что в моих приложениях необходимо выполнить некоторые настройки, прежде чем можно будет использовать переводы. Решение, которое я постоянно вижу, состоит в том, чтобы добавить это к wsgi.py:

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Однако у меня уже есть эти строки. В файле myproject/core/util.py я изменил следующую строку:

from django.utils.translation import ugettext as _

to:

from django.utils.translation import ugettext_lazy as _

И это просто переместило проблему в другой файл, который использовал ugettext. Больше нельзя использовать неленивый ugettext? Или мне нужно выполнить какую-то настройку, чтобы избежать ее оценки во время импорта?


person benwad    schedule 08.01.2016    source источник
comment
это не ответ!! почему вы не хотите использовать последнюю версию? 1,9   -  person Arash Hatami    schedule 08.01.2016
comment
Я постепенно обновляюсь до 1.8, но сначала пытаюсь заставить работать 1.7.   -  person benwad    schedule 08.01.2016
comment
Я думаю, что последняя строка трассировки является важной. Убедитесь, что вы не делаете неленивые вызовы gettext во время импорта, так что да, во время импорта вам нужна ленивая версия.   -  person Sayse    schedule 08.01.2016


Ответы (1)


Проблема с использованием make_url(url, text=ugettext('here')) заключается в том, что аргумент по умолчанию для text оценивается при импорте модуля, а не при выполнении функции make_url.

Вы не показали код, вызвавший вторую ошибку, поэтому я не знаю, что с ним не так.

Можно использовать ugettext внутри функции (если эта функция не запускается во время импорта). Например:

def make_url(url, text=None):
    if text is None:
        text = ugettext('here')

Обратите внимание, что вы все еще можете использовать import uggettext as _ в своем коде, я только что использовал ugettext выше, чтобы быть явным.

person Alasdair    schedule 08.01.2016
comment
Спасибо! Вот оно. Мне просто нужно было изменить ugettext на ugettext_lazy везде, где я получал эту ошибку. К счастью, было всего 2 случая; в основном ugettext работало как и раньше. - person benwad; 08.01.2016