2

Google AppEngine用のPythonAPIを使用していますが、サーバーが一定時間(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)
4

1 に答える 1

1

最初: 情報をタスク キューに保存しない理由。タスク キューを 1 時間ごとに実行して、ジョブを実行できます (リストを取得)。

2番目:ファイルを作成して書き込む場合にのみファイナライズを使用します。ただし、ファイルがファイナライズされた後は、ファイルに書き込むことはできません。ブロブストア内のファイルを更新するには、常に新しいファイルを作成する必要があります。また、ファイルを読み取るときに、ファイルをファイナライズする必要はありません。ファイルを読み取るには、ブロブリーダーを使用する必要があります。参照: https://developers.google.com/appengine/docs/python/blobstore/blobreaderclass

于 2012-10-12T09:05:14.463 に答える