Python 为什么我会得到KeyError:“;Django设置没有';t定义解析器";?
我得到的错误如下: (遗嘱资产)➜ 测试者git:(硕士)✗ django-admin.py测试 正在为别名“default”创建测试数据库。。。 E ====================================================================== 错误:测试\获取\站点\根\带有\设置\覆盖(app.tests.AssetsTestCase) ---------------------------------------------------------------------- 回溯(最近一次呼叫最后一次): 文件“/Volumes/fifteen5cs/testassets/app/tests.py”,第27行,在test\u get\u site\u root\u中,带有\u设置\u覆盖 http_client.get(“/”) get中的文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django/test/client.py”,第473行 response=super(客户机,self).get(路径,数据=data,**额外) get中的文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django/test/client.py”,第280行 返回自我请求(**r) 请求中的文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django/test/client.py”,第444行 六、重放(*exc_信息) 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django/core/handlers/base.py”,第114行,在get_响应中 响应=包装的回调(请求,*回调参数,**回调参数) 文件“/Volumes/fifteen5cs/testassets/app/views.py”,第9行,索引中 上下文\实例=请求上下文(请求)) 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django/shortcuts/init.py”,第29行,在render\u to\u响应中 返回HttpResponse(loader.render_to_string(*args,**kwargs),**HttpResponse_kwargs) 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django/template/loader.py”,第169行,在render_to_字符串中 返回t.render(上下文\实例) 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django/template/base.py”,第140行,在render中 返回self.\u呈现(上下文) 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django/test/utils.py”,第85行,插入指令化测试渲染 返回self.nodelist.render(上下文) render中的文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django/template/base.py”,第840行 bit=self.render_节点(节点,上下文) 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django/template/debug.py”,第78行,在render_节点中 返回node.render(上下文) 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django_assets/templatetags/assets.py”,第72行,呈现 对于bundle.url()中的url: URL中的文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/webassets/bundle.py”,第783行 对于捆绑包、额外过滤器、self.iterbuild(ctx)中的新ctx: iterbuild中的文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/webassets/bundle.py”,第679行 对于捆绑包,在self.resolve\u内容(ctx)中: resolve_contents中的文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/webassets/bundle.py”,第233行 结果=ctx.resolver.resolve\u源(ctx,项) 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/webassets/bundle.py”,第50行,在getattr 返回self.getattr(self.\u父项,项) 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/webassets/bundle.py”,第58行,在getattr中 返回getattr(对象、项) 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/webassets/env.py”,第675行,位于get\U解析器中 返回self.\u存储['resolver'] 文件“/Users/paul/.pyenv/versions/testassets/lib/python2.7/site packages/django_assets/env.py”,第62行,在getitem 自身。_变换_键(键)) KeyError:“Django设置未定义解析器” 我已将此错误半链接到在我的一个单元测试(如下所示)中使用Django utils函数Python 为什么我会得到KeyError:“;Django设置没有';t定义解析器";?,python,django,unit-testing,webassets,django-assets,Python,Django,Unit Testing,Webassets,Django Assets,我得到的错误如下: (遗嘱资产)➜ 测试者git:(硕士)✗ django-admin.py测试 正在为别名“default”创建测试数据库。。。 E ====================================================================== 错误:测试\获取\站点\根\带有\设置\覆盖(app.tests.AssetsTestCase) -----------------------------------------------------
Django.test.utils.override\u settings
(注意,在第二次请求期间引发异常!)
我正在处理的代码库第一次提出了这个问题,它太大,太私有,无法共享,因此我将项目精简为少量代码,仍然会产生这个问题。这个小项目可以在这里找到
我花了两天时间试图确定这个错误的确切来源,以及为什么它发生在第二个请求中,而不是第一个请求中。我尝试了许多单元测试的排列。有趣的是,如果我创建第二个单元测试,一个不启用设置覆盖(如下面的一个)的单元测试,并命名该测试,使其在测试期间首先运行,则测试套件通过。如果我将相同的单元测试放在test\u get\u site\u root\u和\u settings\u overrides
单元测试之后,两者都将失败
def test_get_site_root(self):
http_client = Client()
http_client.get('/')
http_client.get('/')
在此问题上的任何帮助都将不胜感激
最后,我能找到的唯一能说明相同或类似问题的问题是:
更新2015/01/12
这个问题似乎与信号的使用有关。我已将上述失败测试归结为以下几点:
from django.test.utils import override_settings
from django.utils.unittest.case import TestCase
from django_assets.env import get_env
class AssetsTestCase(TestCase):
def test(self):
settings_override = override_settings()
settings_override.enable()
get_env().resolver
settings_override.disable()
settings_override.enable()
get_env().resolver
settings_override.disable()
BundleError: %s not found (using staticfiles finders)
import sys
from django_assets import env as assets_env
settings_override = override_settings(**OVERRIDE_SETTINGS)
settings_override.enable()
... do things ...
settings_override.disable()
assets_env.reset()
assets_env._ASSETS_LOADED = False
del sys.modules['<app_name>.assets']
事实证明,此问题是由于禁用任何
override\u设置后,django\u assets.env.env
单例未重置。此单例对象未在“设置”对象之间重建这一事实意味着,如果在覆盖设置的上下文中构建了django_assets.env.env
对象,则当这些覆盖设置替换为非覆盖设置时,通过创建BundleError: %s not found (using staticfiles finders)
import sys
from django_assets import env as assets_env
settings_override = override_settings(**OVERRIDE_SETTINGS)
settings_override.enable()
... do things ...
settings_override.disable()
assets_env.reset()
assets_env._ASSETS_LOADED = False
del sys.modules['<app_name>.assets']