在Heroku上的Flask应用程序中存储值的最简单方法是什么?

时间:2013-11-21 03:12:52

标签: python heroku flask storage

我在Heroku上运行了一个非常非常简单的Flask应用程序。它所做的就是侦听HTTP POST请求,当它获得格式正确的请求时,会发送一封电子邮件。

有时,应用会在几分钟内收到多个请求。发生这种情况时,我并不特别希望为每个请求发送电子邮件。

我希望能够在发送电子邮件以响应请求时存储时间戳,然后在后续请求中读取该时间戳,以避免发送电子邮件,例如一小时。

似乎我需要在Heroku中使用一些存储加载项,但是对于这个简单的任务来说,所有选项看起来都是完全矫枉过正的。是否有一种简单的方法来存储此时间戳,以便后续请求可用?

3 个答案:

答案 0 :(得分:1)

您需要存储在某个数据库或文件中发送的上一封电子邮件的时间戳值。但是,Heroku使用read-only file system。有一个临时文件系统可以写入,但是其中的文件不会保留在单个Web请求之外,因此这会阻止持久存储。

您有几种选择:

  1. 注册Postgresql database(10K行数据的免费Hobby Dev计划,您需要1)
  2. 注册ClearDB(免费Ignite Plan,最多5MB数据)。
  3. 注册MongoHQMongoHQ Sandbox plan免费,最多250MB的数据)。
  4. 可能使用Amazon's S3之类的外部服务,将最后一封电子邮件的时间戳存储在存储桶中的文本文件中。但是,您将为此带来更多的传入和传出带宽。
  5. 就个人而言,我会选择选项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

不要忘记您需要两个条件才能实现:

  • 只有一个客户端(因为每个客户端都有自己的会话存储空间)
  • 客户端必须支持Cookie(Flask将用户会话编写为安全Cookie)