我在Heroku上运行了一个非常非常简单的Flask应用程序。它所做的就是侦听HTTP POST请求,当它获得格式正确的请求时,会发送一封电子邮件。
有时,应用会在几分钟内收到多个请求。发生这种情况时,我并不特别希望为每个请求发送电子邮件。
我希望能够在发送电子邮件以响应请求时存储时间戳,然后在后续请求中读取该时间戳,以避免发送电子邮件,例如一小时。
似乎我需要在Heroku中使用一些存储加载项,但是对于这个简单的任务来说,所有选项看起来都是完全矫枉过正的。是否有一种简单的方法来存储此时间戳,以便后续请求可用?
答案 0 :(得分:1)
您需要存储在某个数据库或文件中发送的上一封电子邮件的时间戳值。但是,Heroku使用read-only file system。有一个临时文件系统可以写入,但是其中的文件不会保留在单个Web请求之外,因此这会阻止持久存储。
您有几种选择:
Hobby Dev
计划,您需要1)Ignite Plan
,最多5MB数据)。MongoHQ Sandbox plan
免费,最多250MB的数据)。就个人而言,我会选择选项3,但是YMMV ......
答案 1 :(得分:1)
Redis是迄今为止最简单的选择。首先安装它(它是免费的):
$ heroku addons:add redistogo:nano
然后在你的代码中:
import redis
redis.set('last_timestamp', 1234);
last_timestamp = redis.get('last_timestamp;)
请注意,nano计划不包含持久存储,因此在服务器出现故障的远程情况下,您应该计划现在接收任何值。
答案 2 :(得分:0)
如果您的应用程序只有一个客户端,并且该客户端可以接受cookie,那么存储值并稍后调用它的最简单方法是将其写入用户会话。
例如:
from flask import session
@app.route('/api', methods = ['POST'])
def handle_post():
last_email_timestamp = session.get('last_email_timestamp')
now = datetime.utcnow()
if last_email_timestamp is None or
now - last_email_timestamp > timedelta(hours = 1):
# send email
session['last_email_timestamp'] = now
不要忘记您需要两个条件才能实现: