You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Django4.2.1后django_plotly_dash生产环境报属性错误

Django升级至4.2.1后django_plotly_dash报错:'WrappedDash' object has no attribute '_generate_meta_html'

将Django升级至4.2.1版本后,django_plotly_dash无法正常工作,抛出错误:'WrappedDash' object has no attribute '_generate_meta_html'。根据django_plotly_dash官方文档说明,其兼容Django版本范围为5x > Django > 3.2x,但升级后该工具仅能在本地环境正常运行,生产环境返回如下完整报错栈信息:


配置信息

settings.py 配置

INSTALLED_APPS = [
    ...

    'django_plotly_dash.apps.DjangoPlotlyDashConfig',
    'dpd_static_support',
    'channels', 
    'channels_redis'
    ...
]

PLOTLY_COMPONENTS = [
    'dash_core_components',
    'dash_html_components',
    'dash_renderer',
    'dpd_static_support',
    'dpd_components',
    'dash_bootstrap_components',
]

X_FRAME_OPTIONS = 'SAMEORIGIN'

PLOTLY_DASH = {

    "ws_route" :   "dpd/ws/channel",
    "http_route" : "dpd/views",
    "http_poke_enabled" : True,
    "insert_demo_migrations" : False,
    "cache_timeout_initial_arguments": 60,
    "view_decorator": None,
    "cache_arguments": True,
    "serve_locally": False,
}

CHANNEL_LAYERS = {
  'default': {
  'BACKEND': 'channels_redis.core.RedisChannelLayer',
  'CONFIG': {
          'hosts': [('redis', 6379),], #ALSO TRIED USING 127.0.0.1
      },
  },
}

ASGI_APPLICATION = 'core.asgi.application' #Also tried using my custom routing

routing.py 配置

from django_plotly_dash.routing import application

urls.py 配置

from app import custom_dash_app

urlpatterns = [
...
path('django_plotly_dash/', include('django_plotly_dash.urls')),
...
]

HTML模板代码

{% load plotly_dash %}

...
{% plotly_app_bootstrap name="custom_dash_app_name" aspect="16by9" %} <!-- Also tried with direct and with plotly_app  name="" ratio=... -->
...

报错栈信息

Traceback (most recent call last):
web_container |   File "/usr/local/lib/python3.10/site-packages/asgiref/sync.py", line 486, in thread_handler
web_container |     raise exc_info[1]
web_container |   File "/usr/local/lib/python3.10/site-packages/django/core/handlers/exception.py", line 42, in inner
web_container |     response = await get_response(request)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/core/handlers/base.py", line 253, in _get_response_async
web_container |     response = await wrapped_callback(
web_container |   File "/usr/local/lib/python3.10/site-packages/asgiref/sync.py", line 448, in __call__
web_container |     ret = await asyncio.wait_for(future, timeout=None)
web_container |   File "/usr/local/lib/python3.10/asyncio/tasks.py", line 408, in wait_for
web_container |     return await fut
web_container |   File "/usr/local/lib/python3.10/site-packages/asgiref/current_thread_executor.py", line 22, in run
web_container |     result = self.fn(*self.args, **self.kwargs)
web_container |   File "/usr/local/lib/python3.10/site-packages/asgiref/sync.py", line 490, in thread_handler
web_container |     return func(*args, **kwargs)
web_container |   File "/aiterra_web_website/wallet/views.py", line 46, in walletHomepage
web_container |     return render(request, 'investing/wallet-homepage.html', context)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/shortcuts.py", line 24, in render
web_container |     content = loader.render_to_string(template_name, context, request, using=using)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/loader.py", line 62, in render_to_string
web_container |     return template.render(context, request)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/backends/django.py", line 61, in render
web_container |     return self.template.render(context)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 175, in render
web_container |     return self._render(context)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
web_container |     return self.nodelist.render(context)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
web_container |     return SafeString("".join([node.render_annotated(context) for node in self]))
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
web_container |     return SafeString("".join([node.render_annotated(context) for node in self]))
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
web_container |     return self.render(context)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
web_container |     return compiled_parent._render(context)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 167, in _render
web_container |     return self.nodelist.render(context)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
web_container |     return SafeString("".join([node.render_annotated(context) for node in self]))
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
web_container |     return SafeString("".join([node.render_annotated(context) for node in self]))
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
web_container |     return self.render(context)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/loader_tags.py", line 63, in render
web_container |     result = block.nodelist.render(context)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
web_container |     return SafeString("".join([node.render_annotated(context) for node in self]))
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
web_container |     return SafeString("".join([node.render_annotated(context) for node in self]))
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
web_container |     return self.render(context)
web_container |   File "/usr/local/lib/python3.10/site-packages/django/template/library.py", line 258, in render
web_container |     _dict = self.func(*resolved_args, **resolved_kwargs)
web_container |   File "/usr/local/lib/python3.10/site-packages/django_plotly_dash/templatetags/plotly_dash.py", line 149, in plotly_direct
web_container |     resp = view_func()
web_container |   File "/usr/local/lib/python3.10/site-packages/django_plotly_dash/dash_wrapper.py", line 762, in index
web_container |     metas = self._generate_meta_html()
web_container | AttributeError: 'WrappedDash' object has no attribute '_generate_meta_html'

已尝试操作及问题定位

已尝试将Python升级至最新稳定版本,但问题仍未解决。定位到报错来自django_plotly_dash/dash_wrapper.py的index方法,该方法调用了不存在的_generate_meta_html属性,相关代码片段如下:

def index(self, *args, **kwargs):  # pylint: disable=unused-argument
        scripts = self._generate_scripts_html()
        css = self._generate_css_dist_html()
        config = self._generate_config_html()
        metas = self._generate_meta_html()
        renderer = self._generate_renderer()
        title = getattr(self, 'title', 'Dash')
        if self._favicon:
            import flask
            favicon = '<link rel="icon" type="image/x-icon" href="{}">'.format(
                flask.url_for('assets.static', filename=self._favicon))
        else:
            favicon = ''

            _app_entry = '''
            <div id="react-entry-point">
                <div class="_dash-loading">
                   Loading...
                </div>
            </div>
        '''
        index = self.interpolate_index(
            metas=metas, title=title, css=css, config=config,
            scripts=scripts, app_entry=_app_entry, favicon=favicon,
            renderer=renderer)

        return index

内容的提问来源于stack exchange,提问作者Carlos Anaya Garay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:04:53