3

私の Flask プロジェクトでは、ftputilライブラリを使用しています。アプリケーション セクションの 1 つで、 Flask のドキュメントで説明されているように、コンテンツ ストリーミングを使用します。

@app.route('/section')
def section():
    def generate():
        ftp.upload(source, target, "b", callback)
        yield 'completed'
    return Response(generate())

この例の関数は、 ftputil documentationgenerateで説明されているように、FTP サーバーにファイルをアップロードします。

メソッドで使用されるコールバック関数 [ callback(chunk)] は、uploadアップロードされたファイル チャンクごとに実行されます。

len(chunk)コールバックからストリームに出力する可能性はありますか? 汚いハックも大歓迎です。

助けてくれてありがとう!

4

1 に答える 1

1

ftp.upload() は同期的に実行されると想定していますが、これは理にかなっています。以下のコードをテストしていないので、おそらくバグだらけですが、アイデアはうまくいくはずです。

import threading, Queue

@app.route('/section')
def section():
    q = Queue.Queue()
    def callback(chunk):
        q.put(len(chunk))
    t = threading.Thread(target=lambda: ftp.upload(source, target, "b", callback) or q.put(None))
    t.setDaemon(True)
    t.start()
    def generate():
        while 1:
            l = q.get()
            if l is None:
                return
            yield unicode(l) + '\n'
    return Response(generate())
于 2012-05-15T14:28:35.960 に答える