значение datetime.now по умолчанию для записей не изменяется, если flask сервер не перезапущен - PullRequest
0 голосов
/ 08 мая 2020

Я заметил, что когда я отправляю запись на своей странице форм, 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 Ответ

0 голосов
/ 08 мая 2020

Обратите внимание на разницу между фиксированным значением по умолчанию и функцией по умолчанию (которая при необходимости предоставляет значение). В документации показан пример с 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=...)

...