升级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
相关产品推荐
相关产品推荐

