破折号日期选择器max_date_allowed为当前日期无法正常工作



我正在使用仪表板的破折号,并部署在 AWS Elastic Beanstalk.
Datepicker 中存在一个问题max_date_allowed。

因此,部署应用程序的那一天一切正常。但从第二天开始,max_date_allowed将停留在日期上,应用已部署,我们无法选择超出应用部署日期的日期。
仅当我们在环境中选择,从操作菜单中重新启动应用服务器时,它才能再次工作。

这里可能有什么问题?

下面是我们使用的日期选择器代码段。

dcc.Tabs([
dcc.Tab(label='DDR by Date (Default DDR - Last Day)', value='tab-1', children=[
dcc.DatePickerSingle(
id='my-date-picker-single',
min_date_allowed=dt(2020, 1, 18),
max_date_allowed=dt.date(dt.now()),
initial_visible_month=dt.date(dt.now()),
placeholder='Select a date',
display_format='DD/MM/YYYY'
),
html.Button(id='submit-button', n_clicks=0, children='Submit'),
html.Div(id='output-container-date-picker-single')
]),

假设代码段是应用布局定义的一部分,则你看到的行为是有意的。此代码在应用启动时执行,因此此时仅计算dt.date(dt.now())

(至少(有两种常见的方法可以实现您想要的,

  • 将布局定义包装在函数中,并将函数实例分配为应用布局。代码类似于app.layout = make_my_layout_function.通过分配函数,每次用户访问您的页面时都会评估应用程序布局代码。请参阅文档中的更多详细信息(滚动到"页面加载更新"(。

  • 你的情况下,通过回调分配非静态默认值,max_date_allowed。由于回调是在页面加载时执行的(除非您主动阻止它(,因此该值将按预期更新。

我的方法是使用间隔

将间隔设置为每小时触发一次,然后使用回调更新max_date_allowed

采用此方法将消除用户重新加载页面进行更新的需要

例如

@app.callback(Output("date-picker", "max_date_allowed"),
[Input("interval_hours", "n_interval")])
def update_max_date_allowed(n):
return dt.date(dt.now())

最新更新