gpt4 book ai didi

python - 为什么我会收到 KeyError : "Django settings doesn' t define RESOLVER"?

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:42 27 4
gpt4 key购买 nike

我收到以下错误:

(testassets)➜ testassets git:(master) ✗ django-admin.py test Creating test database for alias 'default'... E ====================================================================== ERROR: test_get_site_root_with_settings_overrides (app.tests.AssetsTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Volumes/fifteen5cs/testassets/app/tests.py", line 27, in test_get_site_root_with_settings_overrides http_client.get('/') File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django/test/client.py", line 473, in get response = super(Client, self).get(path, data=data, **extra) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django/test/client.py", line 280, in get return self.request(**r) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django/test/client.py", line 444, in request six.reraise(*exc_info) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/Volumes/fifteen5cs/testassets/app/views.py", line 9, in index context_instance=RequestContext(request)) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django/shortcuts/init.py", line 29, in render_to_response return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django/template/loader.py", line 169, in render_to_string return t.render(context_instance) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django/template/base.py", line 140, in render return self._render(context) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django/test/utils.py", line 85, in instrumented_test_render return self.nodelist.render(context) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django/template/base.py", line 840, in render bit = self.render_node(node, context) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django/template/debug.py", line 78, in render_node return node.render(context) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django_assets/templatetags/assets.py", line 72, in render for url in bundle.urls(): File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/webassets/bundle.py", line 783, in urls for bundle, extra_filters, new_ctx in self.iterbuild(ctx): File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/webassets/bundle.py", line 679, in iterbuild for bundle, _ in self.resolve_contents(ctx): File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/webassets/bundle.py", line 233, in resolve_contents result = ctx.resolver.resolve_source(ctx, item) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/webassets/bundle.py", line 50, in getattr return self.getattr(self._parent, item) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/webassets/bundle.py", line 58, in getattr return getattr(object, item) File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/webassets/env.py", line 675, in _get_resolver return self._storage['resolver'] File "/Users/paul/.pyenv/versions/testassets/lib/python2.7/site-packages/django_assets/env.py", line 62, in getitem self._transform_key(key)) KeyError: "Django settings doesn't define RESOLVER"

----------------------------------------------------------------------
Ran 1 test in 0.325s

FAILED (errors=1)
Destroying test database for alias 'default'...

我已将此错误与在我的一个单元测试(如下所示)中使用 Django utils 函数 django.test.utils.override_settings 进行了半链接

  1 from django.test.utils import override_settings
2 from django.utils.unittest.case import TestCase
3 from django.test.client import Client
4
5
6 OVERRIDE_SETTINGS = {
7 'DEBUG': True,
8 'ASSETS_DEBUG': True,
9 'ASSETS_AUTO_BUILD': True,
10 'ASSETS_URL_EXPIRE': False,
11 'ASSETS_CACHE': False,
12 'ASSETS_MANIFEST': False,
13 'ASSETS_VERSIONS': False,
14 }
15
16
17 class AssetsTestCase(TestCase):
18 def test_get_site_root_with_settings_overrides(self):
19 http_client = Client()
20 # import pdb;pdb.set_trace()
21 settings_override = override_settings(**OVERRIDE_SETTINGS)
22 settings_override.enable()
23 http_client.get('/')
24 settings_override.disable()
25
26 settings_override.enable()
27 http_client.get('/')
28 settings_override.disable()

(注意。在第二次请求期间引发了异常!)

我正在处理的第一个出现此问题的代码库太大且私有(private),无法共享,因此我已将项目精简为少量代码,但仍然会产生问题。可以在此处找到该迷你项目 https://github.com/logston/testassets .

我花了两天多的时间试图确定此错误的确切来源以及为什么它会在第二次请求期间而不是第一次请求期间发生。我已经尝试了许多单元测试的排列。有趣的是,如果我创建第二个单元测试,一个不启用设置覆盖的单元测试(例如下面的单元测试)并命名该测试,使其在测试期间首先运行,则测试套件通过。如果我在 test_get_site_root_with_settings_overrides 单元测试之后放置相同的单元测试,两者都会失败。

      def test_get_site_root(self):
http_client = Client()
http_client.get('/')

http_client.get('/')

如能就此问题提供任何帮助,我们将不胜感激。

最后,我能找到的唯一谈到相同或相似问题的问题是:https://github.com/miracle2k/django-assets/issues/44

更新 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()

最佳答案

原来这个问题是由于 django_assets.env.env禁用任何 override_settings 后单例不会重置.这个单例对象没有在“设置”对象之间重建的事实意味着如果 django_assets.env.env对象是在覆盖设置的上下文中构建的,当那些覆盖设置被换出为非覆盖设置时,通过创建 django_assets.env.env 添加到临时设置模块的任何常量。对象将丢失。 RESOLVERASSETS_CACHE是将丢失的常数的很好的例子。为了避免这种损失,我们必须确保重置 django_assets.env.env通过调用对象 django_assets.env.reset更改设置模块后。打电话reset将强制 django-assets 下次将这些常量重新插入到当前设置模块中 django_assets.env.get_env叫做。

不幸的是,调用 django_assets.env.reset导致 django_assets.env.env._bundle_names要清空的字典(注意,它真的被摧毁了,一个新的被 build 了)。这个字典的丢失会导致如下错误:

BundleError: %s not found (using staticfiles finders)

要解决此问题,我们必须更新 django_assets.env._ASSETS_LOADEDFalse并删除每个应用程序的 assets.py来自 sys.modules 的文件.我们必须更新 _ASSETS_LOADED以便 django-assets 下次尝试重新导入每个应用程序的 Assets 文件 django_assets.env.get_env叫做。调用django_assets.env.get_env还将重建 env._bundle_names字典。最后,我们必须从 sys.modules 中删除每个应用程序的 Assets 模块。否则,__import__('app.assets')不会导入(读作“执行”) Assets 模块,因为 Assets 模块已经导入!

因此,这个问题的完整解决方案如下所示:

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']

顺便说一句,我很乐意听取有关解决此问题的其他方法的建议。

关于python - 为什么我会收到 KeyError : "Django settings doesn' t define RESOLVER"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27895156/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com