2017-07-25 5 views
0

あまりにも言葉のタイトルが残念です。新しいEventSourceでFlaskセッションを使用する

私の目標は、AJAXを使ってFlaskページを設定して、Pythonプログラムの実行中に動的コンテンツをページに追加できるようにすることです。

flask_oauthlibを使用して、REST APIへのアクセストークンを取得し、そのページングされたコンテンツのREST APIにクエリを実行しています。

私は、REST呼び出しを繰り返してAPIからのコンテンツの別のページを取得するので、「進捗状況」を表示したいと考えています。 REST APIアクセストークンは、ユーザーのセッション変数に格納されます。

theseの手順を実行して、基本的な動的ページを作成して実行しています。しかし、私が "progress"関数の変更を開始したときに、セッション変数にアクセスを追加すると、すべてが失敗し始めます。

エラーが表示されます:RuntimeError: Working outside of request context.これは正しいセッションのコンテキストではないことを伝えます。

私の推測は、このエンドポイントがnew EventSourceを使用してjavascriptから呼び出されているからです...この方法でセッションコンテキストにアクセスするにはどうしたらよいでしょうか?

正しいパスを下っているのですか、より良いオプションがありますか?ここで

は、私が持っているさまざまなコードブロックです:

<!DOCTYPE html> 
<html> 
<head> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> 
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> 
    <script> 

    var source = new EventSource("/progress"); 
    source.onmessage = function(event) { 
     $('.text').text(event.data); 
    } 
    </script> 
</head> 
<body> 
     <p class="text"></p> 
</body> 
</html> 

@app.route('/sentMail') 
def sentMail(): 
    return render_template('progress.html') 

@app.route('/progress') 
def progress(): 
    def generate(): 
     #code using trying to use session here 
    return Response(generate(), mimetype= 'text/event-stream') 

答えて

1

Webサーバを使用して、要求コンテキストにアクセスすることはできませんが、ありがたいことフラスコは、ストリームデコレータ@stream_with_context が付属してレスポンスを処理し始めたら、ストリーミングでリクエストコンテキストにアクセスするために使用することができます...

あなたのコードを何かに変更してください下...

from flask import stream_with_context 


@app.route('/progress') 
def progress(): 
    @stream_with_context 
    def generate(): 
     ... 
     Your remaining code 
     ... 
+0

これは機能しました!あなたの非常に簡潔で明確な答えをありがとう:) –

関連する問題