升级到 Django 1.7:为翻译基础设施获取 AppRegistryNotReady
Upgrading to Django 1.7: Getting AppRegistryNotReady for translation infrastructure
我正在从 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 _
至:
from django.utils.translation import ugettext_lazy as _
这只是将问题转移到另一个使用 ugettext
的文件。是不是不能再使用 non-lazy ugettext
了?或者我需要做一些设置以避免在导入时对其进行评估吗?
使用 make_url(url, text=ugettext('here'))
的问题在于 text
的默认参数是在 导入模块时计算的 ,而不是 make_url
函数 运行s.
您没有显示产生第二个错误的代码,所以我不知道它出了什么问题。
可以在函数内部使用 ugettext
(只要该函数在导入期间不 运行)。例如:
def make_url(url, text=None):
if text is None:
text = ugettext('here')
请注意,您仍然可以在代码中执行 import uggettext as _
,我只是在上面使用了 ugettext
来明确说明。
我正在从 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 _
至:
from django.utils.translation import ugettext_lazy as _
这只是将问题转移到另一个使用 ugettext
的文件。是不是不能再使用 non-lazy ugettext
了?或者我需要做一些设置以避免在导入时对其进行评估吗?
使用 make_url(url, text=ugettext('here'))
的问题在于 text
的默认参数是在 导入模块时计算的 ,而不是 make_url
函数 运行s.
您没有显示产生第二个错误的代码,所以我不知道它出了什么问题。
可以在函数内部使用 ugettext
(只要该函数在导入期间不 运行)。例如:
def make_url(url, text=None):
if text is None:
text = ugettext('here')
请注意,您仍然可以在代码中执行 import uggettext as _
,我只是在上面使用了 ugettext
来明确说明。