使用Flask Session与新的EventSource

时间:2017-07-25 18:44:15

标签: javascript python ajax session 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 个答案:

答案 0 :(得分:1)

一旦Web服务器开始处理响应,您就无法访问请求上下文,但幸好Flask附带了流装饰器@stream_with_context  您可以用来访问流媒体中的请求上下文...

将您的代码修改为以下内容......

from flask import stream_with_context


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