你好,有stackoverflow社区
我正在烧瓶中执行一个功能,该功能可以通过后期请求更新变量,然后处理该变量并将其显示到网站中,就像那些体育比赛比分网站一样。
该网站可以正常运行,但是我计划有一些用户,我认为,一旦变量var_g发生变化(不是现在每2秒更改一次),它将比该网站更新要好得多,并且令人难以置信所有用户都可以同时获取更新,希望你们能为我提供帮助
任何建议都会很有帮助,我经验不足,也许我做错了一切。
烧瓶侧面
from flask import Flask, jsonify, render_template, request
# Global variable to keep everything updated
var_g = 0
app = Flask(__name__)
# Getting the post resquest
@app.route('/read', methods=['GET', 'POST'])
def read():
if request.method == 'POST':
# Getting the data to update from headers of post request
info = int(request.headers.get('info'))
# Trying to keep the changes with a global variable
global var_g
var_g = info
print(var_g)
# Procesing data
if var_g == 0:
color = "No color"
elif ( var_g > 0 and var_g < 100 ):
color = "red"
elif ( var_g >= 100 ):
color = "blue"
else:
color = "Unknow"
print(color)
return jsonify(color = color)
# Index
@app.route('/', methods=['GET'])
def index():
if request.method == 'GET':
return render_template('index.html')
HTML边
<html>
<head>
<title> State of colors </title>
</head>
<body>
<p> The color state is </p>
<!--Conecting the results from function /read -->
<p> <span id=results> --- </span> </p>
<!-- json jquery - AJAX -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type=text/javascript>
function colors() {
$.getJSON('/read',
// Getting the updated color
function(data) {
// conecting results to jsonify
$("#results").text(data.color);
});
// Updating every 2 secons
setTimeout(function() {
colors();
}, 2000);
}
// Starting on load
window.onload = colors;
</script>
</body>
</html>
答案 0 :(得分:0)
正如@charlietfl所说,您需要使用WebSocket在状态更新时向服务器发送服务器到客户端通知。不幸的是flask
并不是最佳选择,因为每个请求经典方法通常需要一个线程。每个websocket连接都是一个长期运行的请求,因此在使用flask建立了一定数量的连接之后,您可能会用完线程(工作人员)。解决的一种可能方法是从烧瓶作为框架切换到asyncio。已经有了一个不错的aiohttp库,可以同时支持HTTP和websockets服务器。
这是一个简单的示例,代码看起来像这样(虽然没有运行它,可能需要进行一些调整):
import asyncio
import aiohttp.web
your_state_here = {'counter': 0}
active_clients = []
async def index(request):
return aiohttp.web.Response(text='<your template here>')
async def do_update(request):
# your logic here
your_state_here['counter'] += 1
for ws in active_clients:
ws.send_str('updated %s' % your_state_here['counter'])
return aiohttp.web.Response(text='Ok')
async def on_state_update(request):
ws = aiohttp.web.WebSocketResponse()
await ws.prepare(request)
active_clients.append(ws)
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
if msg.data == 'close':
active_clients.remove(ws)
await ws.close()
return ws
def main():
loop = asyncio.get_event_loop()
app = aiohttp.web.Application(loop=loop)
app.router.add_route('GET', '/', index)
app.router.add_route('POST', '/do_update', do_update)
app.router.add_route('GET', '/updates', on_state_update)
aiohttp.web.run_app(app, port=3000)
if __name__ == '__main__':
main()