抱歉措辞不好。
我的目标是使用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')
答案 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
...