国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python Flask 后端向前端推送信息——輪詢、SSE、WebSocket

這篇具有很好參考價值的文章主要介紹了Python Flask 后端向前端推送信息——輪詢、SSE、WebSocket。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

簡介

后端向前端推送信息,通知任務(wù)完成

輪詢 SSE WebSocket
請求方式 HTTP HTTP TCP長連接
觸發(fā)方式 輪詢 事件 事件
優(yōu)點 實現(xiàn)簡單易兼容 實現(xiàn)簡單開發(fā)成本低 全雙工通信,開銷小,安全,可擴展
缺點 消耗較大 不兼容IE 傳輸數(shù)據(jù)需二次解析,開發(fā)成本大
適用場景 服務(wù)端向客戶端單向推送 網(wǎng)絡(luò)游戲、銀行交互、支付




文章來源地址http://www.zghlxwxcb.cn/news/detail-418147.html

安裝

pip install flask




輪詢

main.py

import time
import threading

from flask_cors import CORS
from flask import Flask, redirect

app = Flask(__name__)
cors = CORS(app)

job = {}  # 任務(wù)狀態(tài)


def do_job(id):
    global job
    job[id] = 'doing'
    time.sleep(5)
    job[id] = 'done'


@app.route('/job/<id>', methods=['POST'])
def create(id):
    """創(chuàng)建任務(wù)"""
    threading.Thread(target=do_job, args=(id,)).start()
    response = redirect(f'/job/{id}')  # 重定向到查詢該任務(wù)狀態(tài)
    return response


@app.route('/job/<id>', methods=['GET'])
def status(id):
    """查詢?nèi)蝿?wù)狀態(tài)"""
    return job.get(id, 'not exist')


if __name__ == '__main__':
    app.run()

index.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>輪詢</title>
    <script src="https://cdn.staticfile.org/jquery/3.6.1/jquery.min.js"></script>
</head>
<body>
<button id="create">執(zhí)行任務(wù)</button>
</body>
<script>
    $("#create").click(function () {
        var id = parseInt(Math.random() * 100000000);  // 任務(wù)ID
        $.post({
            url: "http://127.0.0.1:5000/job/" + id.toString(),
            success: function (response) {
                $("body").append("<p id='p" + id.toString() + "'>任務(wù)" + id.toString() + ":created</p>");
                var interval = setInterval(function () {
                    $.get({
                        url: "http://127.0.0.1:5000/job/" + id.toString(),
                        success: function (response) {
                            console.log(response);
                            $("#p" + id.toString()).text("任務(wù)" + id.toString() + ":" + response)
                            if (response === 'done') {
                                clearInterval(interval);
                            }
                        }
                    });
                }, 1000);
            }
        });
    });
</script>
</html>

效果

Python Flask 后端向前端推送信息——輪詢、SSE、WebSocket




SSE

需要異步啟動 + Redis

gunicorn 無法在 Windows 上運行,WSL 對 gevent 支持不友好,建議在純 Linux 系統(tǒng)下使用

安裝 Redis

sudo apt update
sudo apt install redis-server

安裝

pip install flask-sse gunicorn gevent

sse.py

from flask import Flask, render_template

from flask_sse import sse
from flask_cors import CORS

app = Flask(__name__)
app.config['REDIS_URL'] = 'redis://localhost'
app.register_blueprint(sse, url_prefix='/stream')
cors = CORS(app)


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


@app.route('/hello')
def publish_hello():
    sse.publish({'message': 'Hello!'}, type='greeting')
    return 'Message sent!'

templates/index.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>SSE</title>
    <script src="https://cdn.staticfile.org/jquery/3.6.1/jquery.min.js"></script>
</head>
<body>
<h1>Flask-SSE Quickstart</h1>
<script>
    var source = new EventSource("stream");
    source.addEventListener("greeting", function (event) {
        var data = JSON.parse(event.data);
        console.log(data.message)
        $("body").append("<p>" + data.message + "</p>");
    }, false);
    source.addEventListener("error", function (event) {
        console.log("Failed to connect to event stream. Is Redis running?");
    }, false);
</script>
</body>
</html>

啟動

gunicorn sse:app --worker-class gevent --bind 127.0.0.1:8000

nginx 配置

location ^~ /sse/ {
    proxy_pass http://127.0.0.1:8000/;
    proxy_set_header Connection '';
    proxy_http_version 1.1;
    chunked_transfer_encoding off;
}

效果

Python Flask 后端向前端推送信息——輪詢、SSE、WebSocket




WebSocket

異步啟動,eventlet 性能最好,然后是 gevent

安裝

pip install flask-socketio gunicorn eventlet

pip install flask-socketio gunicorn gevent-websocket

main.py

from flask_socketio import SocketIO
from flask import Flask, render_template, request

app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins='*')
connected_sids = set()  # 存放已連接的客戶端


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


@socketio.on('connect')
def on_connect():
    connected_sids.add(request.sid)
    print(f'{request.sid} 已連接')


@socketio.on('disconnect')
def on_disconnect():
    connected_sids.remove(request.sid)
    print(f'{request.sid} 已斷開')


@socketio.on('message')
def handle_message(message):
    """收消息"""
    data = message['data']
    print(f'{request.sid} {data}')


@app.route('/hello', defaults={'sid': None})
@app.route('/hello/<sid>')
def hello(sid):
    """發(fā)消息"""
    if sid:
        if sid in connected_sids:
            socketio.emit('my_response', {'data': f'Hello, {sid}!'}, room=sid)
            return f'已發(fā)信息給{sid}'
        else:
            return f'{sid}不存在'
    else:
        socketio.emit('my_response', {'data': 'Hello!'})
        return '已群發(fā)信息'


if __name__ == '__main__':
    socketio.run(app)

templates/index.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>WebSocket</title>
    <script src="https://cdn.staticfile.org/jquery/3.6.1/jquery.min.js"></script>
    <script src="https://cdn.staticfile.org/socket.io/4.5.2/socket.io.min.js"></script>
</head>
<body>
<h1>Flask-SocketIO Quickstart</h1>
<h2 id="sid">客戶端</h2>
<h2>發(fā)消息</h2>
<input id="emit_data" value="Hello World!">
<button id="emit">發(fā)消息</button>
<h2>收消息</h2>
<div id="log"></div>
<script>
    var socket = io();
    // var socket = io("ws://127.0.0.1:5000");

    socket.on("connect", function () {
        $("#sid").text("客戶端:" + socket.id)
    });

    $("#emit").click(function () {
        socket.emit("message", {data: $("#emit_data").val()});
    });  // 點擊按鈕發(fā)消息

    socket.on("my_response", function (msg) {
        $("#log").append("<p>" + msg.data + "</p>");  // 收消息
    });
</script>
</body>
</html>

效果

Python Flask 后端向前端推送信息——輪詢、SSE、WebSocket

更多內(nèi)容查閱官方示例

WebSocekt 是 HTML5 規(guī)范的一部分,是一種應(yīng)用層協(xié)議,借鑒了 socket 思想,為客戶端和服務(wù)端之間提供了雙向通信功能,包含一套標準的 API。


Socket.IO 是一個 JavaScript 庫,不僅支持 WebSocket,還支持許多種輪詢機制,當 Socket.IO 檢測到當前環(huán)境不支持 WebSocket 時,能自動選擇最佳方式實現(xiàn)網(wǎng)絡(luò)實時通信。


后端 Flask-Sockets 對應(yīng)前端使用原生 WebSocekt
后端 Flask-SocketIO 對應(yīng)前端使用 Socket.IO(推薦這種)




事件

  • error:
  • reconnect:
  • reconnect_attempt:
  • reconnect_error:
  • reconnect_failed:
  • ping:
  • connect:
  • disconnect:
  • connect_error:




參考文獻

  1. Flask-SSE Documentation
  2. Flask-SocketIO Documentation
  3. 長連接/websocket/SSE等主流服務(wù)器推送技術(shù)比較
  4. Server-Sent Events 與 WebSocket 的比較
  5. 七牛云CDN
  6. js停止setInterval的方法與setInterval循環(huán)執(zhí)行的注意事項
  7. Python flaks-sse 庫的簡單測試
  8. Ubuntu用命令行打開網(wǎng)頁的三種方法
  9. 如何使用W3M從Linux終端瀏覽
  10. 3種 Linux 命令行中使用的 Web 瀏覽器
  11. EventSource / Server-Sent Events through Nginx
  12. Server-Sent Events connection timeout on Node.js via Nginx
  13. Flask教程(十九)SocketIO
  14. flask-socketio筆記
  15. websocket在線測試
  16. WebSocket 教程 - 阮一峰的網(wǎng)絡(luò)日志
  17. 手摸手教你使用WebSocket
  18. Web端即時通訊技術(shù)盤點:短輪詢、Comet、Websocket、SSE
  19. Client API | Socket.IO
  20. WebSocket 與 Socket.IO
  21. WebSocket - Web API 接口參考 | MDN
  22. 在flask上使用websocket
  23. WebSocket詳解(一):初步認識WebSocket技術(shù)
  24. Flask:使用SocketIO實現(xiàn)WebSocket與前端Vue進行實時推送
  25. Flask使用flask_socketio將信息時時推送前臺
  26. 使用 Flask-SocketIO 實現(xiàn)私聊:通過flask-socketio中的sid給指定的客戶端發(fā)送消息,對方接收不到
  27. Flask route parameters default values

到了這里,關(guān)于Python Flask 后端向前端推送信息——輪詢、SSE、WebSocket的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java后端向前端返回文件流——實現(xiàn)下載功能!

    Java后端向前端返回文件流——實現(xiàn)下載功能!

    前端實現(xiàn)文件下載功能有多種方法,這里就不一一介紹,這里只介紹使用文件流下載的實現(xiàn)方法。 既然是文件流那就肯定需要給前端返回一堆二進制編碼,作為后端就可以返回一個 OutPutStream 后端可以使用Java中servlet提供的 HttpServletResponse ,核心步驟是要設(shè)置響應(yīng)的數(shù)據(jù)類型

    2024年02月08日
    瀏覽(28)
  • 前端實現(xiàn)消息推送、即時通信、SSE、WebSocket、http簡介

    前端實現(xiàn)消息推送、即時通信、SSE、WebSocket、http簡介

    服務(wù)端主動向客戶端推送消息,使客戶端能夠即時接收到信息。 場景 頁面接收到點贊,消息提醒 聊天功能 彈幕功能 實時更新數(shù)據(jù)功能 短輪詢 瀏覽器(客戶端)每隔一段時間向服務(wù)器發(fā)送http請求,服務(wù)器端在收到請求后,不論是否有數(shù)據(jù)更新,都直接進行響應(yīng)。 本質(zhì):客

    2024年02月16日
    瀏覽(18)
  • SSE實現(xiàn)消息實時推送,前端漸進式學(xué)習、實踐,真香

    SSE(Server Sent Event),直譯為服務(wù)器發(fā)送事件,顧名思義,也就是客戶端可以獲取到服務(wù)器發(fā)送的事件。我們常見的 http 交互方式是客戶端發(fā)起請求,服務(wù)端響應(yīng),然后一次請求完畢;但是在 sse 的場景下,客戶端發(fā)起請求,連接一直保持,服務(wù)端有數(shù)據(jù)就可以返回數(shù)據(jù)給客戶端

    2024年02月21日
    瀏覽(20)
  • 【python】flask模板渲染引擎Jinja2,通過后端數(shù)據(jù)渲染前端頁面

    【python】flask模板渲染引擎Jinja2,通過后端數(shù)據(jù)渲染前端頁面

    ?? 歡迎大家來到景天科技苑?? ???? 養(yǎng)成好習慣,先贊后看哦~???? ?? 作者簡介:景天科技苑 ??《頭銜》:大廠架構(gòu)師,華為云開發(fā)者社區(qū)專家博主,阿里云開發(fā)者社區(qū)專家博主,CSDN新星創(chuàng)作者,掘金優(yōu)秀博主,51CTO博客專家等。 ??《博客》:Python全棧,前后端開

    2024年04月11日
    瀏覽(47)
  • Python Tornado 實現(xiàn)SSE服務(wù)端主動推送方案

    Python Tornado 實現(xiàn)SSE服務(wù)端主動推送方案

    SSE 是 Server-Sent Events 的簡稱, 是一種服務(wù)器端到客戶端(瀏覽器)的單項消息推送。對應(yīng)的瀏覽器端實現(xiàn) Event Source 接口被制定為 HTML5 的一部分。相比于 WebSocket ,服務(wù)器端和客戶端工作量都要小很多、簡單很多,而 Tornado 又是 Python 中的一款優(yōu)秀的高性能 web 框架,本文帶領(lǐng)大

    2024年02月21日
    瀏覽(24)
  • 【快速開始】一個簡單的Flask-SocketIO應(yīng)用,完成后端推送消息接收與關(guān)閉

    【快速開始】一個簡單的Flask-SocketIO應(yīng)用,完成后端推送消息接收與關(guān)閉

    本人使用環(huán)境及版本: Anaconda: 虛擬環(huán)境: Python版本:3.8.13 安裝包及版本: Flask-SocketIO :5.3.4 eventlet :0.33.3 創(chuàng)建app.py文件(文件名隨意,不過要與后面的運行腳本中指定的文件保持一致) cmd 或者 linux控制臺運行即可 此時能看到如下圖所示 此時訪問http://0.0.0.0:5200(0.0.0

    2024年02月13日
    瀏覽(33)
  • 即時通訊:短輪詢、長輪詢、SSE 和 WebSocket 間的區(qū)別

    在現(xiàn)代 Web 開發(fā)中,即時通訊已經(jīng)成為許多應(yīng)用程序的重要組成部分。為了實現(xiàn)即時通訊,開發(fā)人員通常使用不同的技術(shù)和協(xié)議。本文將介紹四種常見的即時通訊實現(xiàn)方法:短輪詢、長輪詢、SSE(服務(wù)器發(fā)送事件)和 WebSocket,并探討它們之間的區(qū)別。 短輪詢是最簡單的即時通

    2024年02月12日
    瀏覽(27)
  • IM通信技術(shù)快速入門:短輪詢、長輪詢、SSE、WebSocket

    IM通信技術(shù)快速入門:短輪詢、長輪詢、SSE、WebSocket

    ??IM通信技術(shù)快速入門:短輪詢、長輪詢、SSE、WebSocket ☆* o(≧▽≦)o *☆嗨~我是IT·陳寒?? ?博客主頁:IT·陳寒的博客 ??該系列文章專欄:Java面試技巧 ??其他專欄:Java學(xué)習路線 Java面試技巧 Java實戰(zhàn)項目 AIGC人工智能 數(shù)據(jù)結(jié)構(gòu)學(xué)習 ??文章作者技術(shù)和水平有限,如果文中

    2024年02月05日
    瀏覽(22)
  • Server-Sent Events(以下簡稱 SSE)及event-source-polyfill使用單向長連接(后臺主動向前端推送)

    Server-Sent Events(以下簡稱 SSE)及event-source-polyfill使用單向長連接(后臺主動向前端推送)

    SSE 與 WebSocket 作用相似,都是建立瀏覽器與服務(wù)器之間的通信渠道,然后服務(wù)器向瀏覽器推送信息SSE 是單向通道,只能服務(wù)器向瀏覽器發(fā)送,因為流信息本質(zhì)上就是下載。如果瀏覽器向服務(wù)器發(fā)送信息,就變成了另一次 HTTP 請求 使用方法? Server-Sent Events 教程 - 阮一峰的網(wǎng)絡(luò)

    2024年02月12日
    瀏覽(29)
  • websockets-后端主動向前端推送消息

    websockets-后端主動向前端推送消息

    公司領(lǐng)導(dǎo)提出了一個新的需求,那就是部門主管在有審批消息的情況下,需要看到提示消息。其實這種需求最簡單的方法使接入短信、郵件、公眾號平臺。直接推送消息。但是,由于使自研項目,公司領(lǐng)導(dǎo)不想花錢,只能另辟蹊徑。 WebSocket協(xié)議是基于TCP的一種新的網(wǎng)絡(luò)協(xié)議。

    2024年02月09日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包