在Python App Engine API中编写和读取blobstore文件以存储时间戳

时间:2012-10-12 02:33:26

标签: python google-app-engine blobstore

我正在使用适用于Google App Engine的python API,我想要做的是从服务器加载一个文件列表,如果它已超过一段时间(例如1小时)。

为此,我尝试将执行的最后一个操作小时存储到文件中并在下次读取它以了解与下一个请求的当前执行时间的差异,但后来我发现GAE不允许将文件写入磁盘,所以我不得不使用blobstore。我尝试将我已经拥有的相同功能放在一起但使用blobstore函数,但即使创建文件,每次我尝试阅读它时都会收到错误消息:

FinalizationError: ApplicationError: 101 Blobkey not found.

我不确定我在做什么是错的。我是GAE的新手,不知道这是否是做我需要做的最好的方法,我找不到一个例子,你在GAE文档中的同一个脚本中读写文件文件API。

提前感谢您提供给我的任何提示。

这是我的代码的摘要版本,get和set函数与代码中的相同:

# imports...
from datetime import datetime as time
from google.appengine.api import files

# create file
last_request_file = files.blobstore.create()


def update_list(time_interval):
    # Get the time of the current request
    current_time = time.now()

    # Calculate timelapse between this an the last request
    last_request = get_last_request_time(last_request_file)
    elapsed_time = current_time - last_request

    # If more than an interval update proxy list
    if elapsed_time.total_seconds() >= time_interval:
        # Request new list from the server
        my_list = getList()

    # Update last_request time
    set_last_request(last_request_file)

    return my_ist


def get_last_request_time(file_name):
    request_time = None

    with files.open(file_name, 'r') as f:
        text_time = f.read()
        if text_time:
            request_time = time.strptime(text_time, '%Y-%m-%d %H:%M:%S')
        else: # file was empty
            request_time = time.min

    # Finalize to close the file.
    files.finalize(file_name)

    return request_time


def set_last_request_time(file_name):
    current_time = time.now()

    # Open the file and write to it
    with files.open(file_name, 'a') as f:
        f.write(time.strftime(current_time, '%Y-%m-%d %H:%M:%S')+'\n')

    # Finalize to close the file.
    files.finalize(file_name)

1 个答案:

答案 0 :(得分:1)

第一:为什么不将信息存储在任务队列中。您可以每小时运行一个任务队列来完成工作(获取列表)。

第二:只有在创建文件并写入文件时才使用finalize。但是,在完成文件后,您无法写入文件。要更新blobstore中的文件,您始终必须创建一个新文件。当您阅读文件时,您不必完成它。要读取文件,您必须使用blobreader。请参阅:https://developers.google.com/appengine/docs/python/blobstore/blobreaderclass