Flask请求上下文源码讲解,简单的群聊单聊web

请求上下文流程图

Flask请求上下文源码讲解,简单的群聊单聊web

群聊html代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p><input type="text" id="nickname">
<button onclick="create_conn()">登录聊天室</button>
</p>
<p><input type="text" id="content">
<button onclick="send_msg()">发送消息</button>
</p>
<div id="message" style="width: 300px; border:2px solid red;"> </div> </body>
<script type="text/javascript">
var ws = null;
var nickname = null; function create_conn() {
nickname = document.getElementById("nickname").value;
ws = new WebSocket("ws://192.168.15.108:9527/ws/" + nickname);
ws.onopen = function () {
alert("欢迎登陆九聊");
};
ws.onmessage = function (data) {
var ws_msg = JSON.parse(data.data);
create_chat(ws_msg);
};
} function create_chat(text, self) {
var ptag = document.createElement("p");
if (self == "w") {
ptag.style.cssText = "text-align: right";
ptag.innerText = text.msg + ":" + text.sender;
} else {
ptag.style.cssText = "text-align: left";
ptag.innerText = text.sender + ":" + text.msg;
} document.getElementById("message").appendChild(ptag);
} function send_msg() {
var msg = document.getElementById("content").value;
// msg_json = JSON.stringify({"to_user":"","msg":msg});
ws.send(msg_json); create_chat({sender:nickname,msg:msg}, "w");
}; </script>
</html>

群聊flask代码

from flask import Flask, request,render_template
from geventwebsocket.websocket import WebSocket
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
import json app = Flask(__name__) user_socket_list = []
user_socket_dict = {} @app.route("/index")
def index():
return render_template("ws.html") @app.route("/ws/<nickname>")
def ws(nickname):
user_socket = request.environ.get("wsgi.websocket") # type: WebSocket
# user_ip = request.environ.get("")
print(nickname,":",request.environ.get("REMOTE_ADDR")) if user_socket:
user_socket_dict[nickname] = user_socket print(len(user_socket_dict), user_socket_dict)
while 1:
msg = user_socket.receive()
send_str = {"sender":nickname,"msg":msg}
for nname,usocket in user_socket_dict.items():
if usocket != user_socket:
try:
usocket.send(json.dumps(send_str))
except:
user_socket_dict.pop(nname) # http://127.0.0.1:9527/ws
# websocket://127.0.0.1:9527/ws if __name__ == '__main__':
# app.run("0.0.0.0",9527,debug=True) http_serv = WSGIServer(("0.0.0.0", 9527), app, handler_class=WebSocketHandler) http_serv.serve_forever()
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p><input type="text" id="nickname">
<button onclick="create_conn()">登录聊天室</button>
</p>
<p>给<input type="text" id="who">
发送<input type="text" id="content">
<button onclick="send_msg()">发送消息</button>
</p>
<div id="message" style="width: 300px; border:2px solid red;"> </div> </body>
<script type="text/javascript">
var ws = null;
var nickname = null; function create_conn() {
nickname = document.getElementById("nickname").value;
ws = new WebSocket("ws://127.0.0.1:9527/ws/" + nickname);
ws.onopen = function () {
alert("欢迎登陆九聊");
};
ws.onmessage = function (data) {
var ws_msg = JSON.parse(data.data);
console.log(ws_msg);
create_chat(ws_msg);
};
} function create_chat(text, self) {
var ptag = document.createElement("p");
if (self == "w") {
ptag.style.cssText = "text-align: right";
ptag.innerText = text.msg + ":" + text.sender;
} else {
ptag.style.cssText = "text-align: left";
ptag.innerText = text.sender + ":" + text.msg;
}
document.getElementById("message").appendChild(ptag);
} function send_msg() {
var msg_str = document.getElementById("content").value;
var who = document.getElementById("who").value;
msg_json = JSON.stringify({"to_user":who,"msg":msg_str});
ws.send(msg_json); create_chat({sender:nickname,msg:msg_str}, "w");
}; </script>
</html>

私聊html

from flask import Flask, request, render_template
from geventwebsocket.websocket import WebSocket
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
import json app = Flask(__name__) user_socket_list = []
user_socket_dict = {} @app.route("/index")
def index():
return render_template("ws.html") @app.route("/ws/<nickname>")
def ws(nickname):
user_socket = request.environ.get("wsgi.websocket") # type: WebSocket
# user_ip = request.environ.get("")
print(nickname, ":", request.environ.get("REMOTE_ADDR")) if user_socket:
user_socket_dict[nickname] = user_socket print(len(user_socket_dict), user_socket_dict)
while 1:
msg = user_socket.receive()
msg_dict = json.loads(msg)
print(msg_dict)
# {msg : "FUCK" ,to_user:yinwangba}
# send_str = {"sender": nickname, "msg": msg} # msg[to_user] = teacher
usocket = user_socket_dict[msg_dict.get("to_user")]
send_msg = json.dumps({"sender": nickname, "msg": msg_dict.get("msg")})
usocket.send(send_msg)
# dj = {sender:nickname,msg:"FUCK"}
# usocket.send(dj)
#----------------------------web端----------------------
# {from_user:nickname,msg:"FUCK"}
####### {msg : "FUCK" ,to_user:yinwangba} ######
# {msg : "FUCK too" ,to_user:nickname} # http://127.0.0.1:9527/ws
# websocket://127.0.0.1:9527/ws if __name__ == '__main__':
# app.run("0.0.0.0",9527,debug=True)
print('hhh')
http_serv = WSGIServer(("127.0.0.1", 9527), app, handler_class=WebSocketHandler) http_serv.serve_forever()

私聊flask

上一篇:Flask核心机制--上下文源码剖析


下一篇:3.flask核心与源码剖析