【问题标题】:What is the simplest way to store a value in a Flask app on Heroku? [closed]在 Heroku 上的 Flask 应用程序中存储值的最简单方法是什么? [关闭]
【发布时间】:2013-11-21 03:12:51
【问题描述】:

我有一个非常非常简单的 Flask 应用程序在 Heroku 上运行。它所做的只是监听 HTTP POST 请求,并在收到格式正确的请求时发送电子邮件。

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

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

似乎我需要在 Heroku 中使用一些存储插件,但是对于这个简单的任务来说,所有选项似乎完全是多余的。有没有一种简单的方法来存储这个时间戳,以便后续请求可以使用它?

【问题讨论】:

  • 从编程的角度来看最简单?最初编码有多难?支持它的代码有多难?或者从行政支持的角度来看?确保它正在运行有多难(如果“它”是实际“运行”的东西)?备份/恢复数据库有多难?我们不可能在这里给你一个“正确”的答案。

标签: python heroku flask storage


【解决方案1】:

如果您的应用程序只有一个客户端,并且该客户端可以接受 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)

【讨论】:

    【解决方案2】:

    Redis 是迄今为止最简单的选择。先安装(免费):

    $ heroku addons:add redistogo:nano
    

    然后在你的代码中:

    import redis
    
    redis.set('last_timestamp', 1234);
    last_timestamp = redis.get('last_timestamp;)
    

    请注意,nano 计划不包括持久存储,因此在服务器出现故障的远程情况下,您应该计划现在接收任何值。

    【讨论】:

      【解决方案3】:

      您需要将最后一封电子邮件的时间戳值存储在数据库或文件中的某处。然而,Heroku 使用read-only file system。有一个可以写入的临时文件系统,但是其中的文件不会保留通过单个 Web 请求,因此这排除了持久存储。

      您有多种选择:

      1. 注册Postgresql database(免费Hobby Dev 10K 行数据计划,您需要 1 个)
      2. 注册ClearDBIgnite Plan 免费,最多 5MB 数据)。
      3. 注册MongoHQMongoHQ Sandbox plan 免费,最多 250MB 数据)。
      4. 可能使用Amazon's S3 之类的外部服务,将最后一封电子邮件的时间戳存储在存储桶中的文本文件中。但是,您会为此产生更多的传入和传出带宽。

      就个人而言,我会选择选项 3,但是 YMMV...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-16
        • 2012-07-05
        • 1970-01-01
        • 2012-05-30
        • 2010-09-30
        • 2015-08-19
        • 1970-01-01
        相关资源
        最近更新 更多