2017-12-07 13 views
1

私はフラスコフレームワークを使用しているPythonサーバーを持っています。Flask Server:同じセッション内のデータを使用する

私のアプリケーションは、ユーザーと通話し、ユーザーが提供するデータセットで何らかの計算を実行するチャットボットです。

私はすでにこのデータをサーバーにアップロードできますが、データを使用しようとするともう読み込まれません。だから私はユーザーが私のサーバーから切断するまで、このデータを使用する必要があります。

Flask Documentationを読んで、私が必要とするものにつながるいくつかの情報を見つけました。 The Application Context

私は正しい方向にありますか?あなたの問題に複数のソリューションがあります

@app.route('/', methods=['GET', 'POST']) 
def index(): 
if request.method == 'POST': 
    # check if the post request has the file part 
    if 'file' not in request.files: 
     flash('No file part') 
     return redirect(request.url) 
    file = request.files['file'] 
    # if user does not select file, browser also 
    # submit a empty part without filename 
    if file.filename == '': 
     flash('No selected file') 
     return redirect(request.url) 
    if file and allowed_file(file.filename): 
     filename = secure_filename(file.filename) 
     stream = io.StringIO(file.stream.read().decode("UTF8"), newline=None) 
     csv_input = pd.read_csv(stream,sep=None,engine='python') 
     file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
     session['receive_count'] = session.get('receive_count', 0) + 1 
     return render_template('index.html', async_mode=socketio.async_mode) 

return render_template('index.html', async_mode=socketio.async_mode) 
+0

ファイルはアップロードされていますか?ファイルをどこに保存していますか?あなたはファイルを読んで、そのデータを変数に格納していますか?最小限のコード例を作成する(あなたが持っている問題に特有でないものを削除する) – qff

+0

いいえ、アップロードしたコード部分を書きました。私は関数の前に作成した変数にファイルを格納しています。 –

答えて

1

これは、私は、サーバーにファイルをアップロードしています方法です。

ここでは、file変数はindex() -functionのローカル変数です。関数外で定義した変数を使用する場合は(requestsessionのようにインポートされません)、関数global fileを使用して関数を開始する必要があります。

私はファイル名をsessionに保存し、データが必要なときに再度ファイルを読み込みます。そうすれば、ユーザーにとってはローカルになり、大量のデータをメモリに格納することはありません。さらに、session.permanent = Trueを使用すると、サーバーとブラウザの再起動に関係なく、その「ユーザー」の月間保存されます。

編集: この答えはもともとあなたがグローバルを保存するためにフラスコg -objectを使用することができると述べました。しかし、gオブジェクトは、アプリケーションコンテキスト内に存在していても要求に対してローカルです。 (つまり、gオブジェクトに保存されているデータにはアクセスできません。同じリクエスト内でのみアクセス可能です)

+1

"g-objectはサーバーへの複数のリクエストにわたって永続的です(削除されない)"これは完全に間違っています。 'g'は各リクエストに固有のものですが、リクエスト中にデータ*を格納する場所です。 – davidism

+0

@davidismたぶん、誤解されているように、ドキュメントではアプリケーションのコンテキストスコープはhttp://flask.pocoo.org/docs/0.12/api/#flask.gだと言われていますが、それ以上の場合は有効です単一の要求の場合 – qff

+0

私は正しいと理解していれば、私のオプションは: 1 - 私はインデックス関数の外でそれを使用する場合は、グローバルとして変数を宣言する必要があります。 @qffの提案。 2 - グローバルデータを保持するためにFlask以外のデータソースを使用する。データベース、memcached、またはredis。 あなたは何をお勧めしますか? –

関連する問題