除非重新启动烧瓶服务器,否则条目的默认 datetime.now 值不会改变

Posted

技术标签:

【中文标题】除非重新启动烧瓶服务器,否则条目的默认 datetime.now 值不会改变【英文标题】:default datetime.now value on entries doesnt change unless flask server restarted 【发布时间】:2020-08-24 08:46:45 【问题描述】:

我注意到当我在表单页面中提交条目时,除非重新启动,否则 date_input 将在随后的提交中重复。为什么会这样?我发誓重复的时间相隔几分钟,但似乎提交的时间仅来自服务器重启。我也在使用flask-sqlalchemy。

models.py

class Entry(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200), unique=True, nullable=False)
    date_input = db.Column(db.DateTime, nullable=False, default=datetime.now(tz=pytz.timezone('Asia/Manila')))
Entry.date_input timestamp results (copy-pasted from cli)

 1. 2020-05-09 00:59:07.269489
 2. 2020-05-09 01:08:56.676228
 3. 2020-05-09 01:10:44.032547
 4. 2020-05-09 01:10:44.032547
 5. 2020-05-09 01:10:44.032547
 6. 2020-05-09 01:10:44.032547
 7. 2020-05-09 01:23:28.636399
 8. 2020-05-09 01:23:28.636399
 9. 2020-05-09 01:23:28.636399
Actual POST logs (copy-pasted from cli)

 1. 127.0.0.1 - - [09/May/2020 01:00:55]
 2. 127.0.0.1 - - [09/May/2020 01:09:25]
 3. 127.0.0.1 - - [09/May/2020 01:14:49]
 4. 127.0.0.1 - - [09/May/2020 01:18:07]
 5. 127.0.0.1 - - [09/May/2020 01:21:39]
 6. 127.0.0.1 - - [09/May/2020 01:23:46]
 7. 127.0.0.1 - - [09/May/2020 01:25:14]
 8. 127.0.0.1 - - [09/May/2020 01:25:14]
 9. 127.0.0.1 - - [09/May/2020 01:25:56]
Server restarts
-I took the timestamps from the first GET result after running the server. 
 The initial running itself doesnt have time indicated

 1. 127.0.0.1 - - [09/May/2020 00:59:11]
 2. 127.0.0.1 - - [09/May/2020 01:09:25]
 3. 127.0.0.1 - - [09/May/2020 01:10:50]
 4. 127.0.0.1 - - [09/May/2020 01:23:31]

【问题讨论】:

【参考方案1】:

注意固定默认值和默认函数(在需要时提供值)之间的区别。 documentation 显示了 datetime.now 的示例。

您当前的代码可以重写为:

dt = datetime.now(tz=pytz.timezone('Asia/Manila')) # evaluated once
date_input = db.Column(db.DateTime, nullable=False, default=dt)

要修复代码,请将表达式替换为函数,例如default=lambda: datetime.now(tz=...)

【讨论】:

以上是关于除非重新启动烧瓶服务器,否则条目的默认 datetime.now 值不会改变的主要内容,如果未能解决你的问题,请参考以下文章

除非我重新启动计算机,否则 HttpWebRequest 每次都无法连接

Android - 添加到 SQLite 数据库后不会更新 ListView,除非重新启动应用程序

除非在授予权限后重新启动应用程序,否则无法写入外部存储

除非重新启动项目,否则 VS .Net Core Razor 页面不会更新

是否有一种简单的方法可以在烧瓶中使会话超时?

除非重新加载页面,否则 React 应用程序路由不会加载内容