flask-socketio实现的网页聊天室(一)

前言

我是一个大一的学生,参加学校工作室的考核,学习了一点flask的相关知识,这个聊天室只有两个页面,前段用的也是简单的js原生代码进行的一些dom操作
在这里插入图片描述

请添加图片描述

一、直接使用

想直接跑的可以自取
https://github.com/cgynb/a-flask-project/tree/chat
首先你需要配置一个虚拟环境,并且激活,不会的话,可以百度谷歌必应[doge]
然后安装第三方库

pip install -r package.txt

在命令行输入

python app.py

二、步骤

1.需要的东西

2.后端代码

引入

引入flask的一些东西,然后引入flask-socketio的SocketIO

from flask import Flask, render_template, request, session, redirect, url_for
from flask_socketio import SocketIO


app = Flask(__name__)
app.config['SECRET_KEY'] = 'jjj'

socketio = SocketIO()
socketio.init_app(app)
一些初始化

设置秘钥,然后给SocketIO绑定app

app = Flask(__name__)
app.config['SECRET_KEY'] = 'jjj'

socketio = SocketIO()
socketio.init_app(app)
视图函数

三个视图函数,首页,聊天,退出

首页

如果是get访问的话,判断会话中是否有’username’,如果有重定向到聊天界面,如果没有,则渲染首页
用post访问的话,获取表单,设置会话,然后重定向到聊天界面

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'GET':
        if 'username' in session:
            return redirect(url_for('chat'))
        return render_template('index.html')
    else:
        username = request.form.get('username')
        session['username'] = username
        return redirect(url_for('chat'))
聊天

判断会话中是否有’username’,如果与渲染聊天界面,并传入username,如果没有,重定向到首页

@app.route('/chat/')
def chat():
    if 'username' in session:
        username = session['username']
        return render_template('chat.html', username=username)
    else:
        return redirect(url_for('index'))
退出登录

退出登录,就是删除会话

@app.route('/logout/')
def logout():
    if 'username' in session:
        session.clear()
    return redirect(url_for('index'))

前段代码

页面效果不是重点,可以看看materialize的文档,简单看看就可以做到初步上手了,也可以到置顶的github仓库下载
主要是js的代码,即对于socketio的使用

index

这边的用的计时器方法的目的是,让用户输入昵称,如果不输入,按钮是不可点击的,所以每0.3秒判断一次
让按钮不可点击,是通过materialize的一个类disabled来控制的,所以添加或者删除类即可

let inp = document.querySelector('#icon_prefix');
let btn = document.querySelector('#submit');
setInterval(function () {
    if(inp.value){
        btn.classList.remove('disabled');
    }else{
        if(!btn.classList.contains('disabled')){
            btn.classList.add('disabled');
        }
    }
}, 300);
chat

这边从用户连接,发送信息来讲

用户连接、断开连接
let socket= io();
socket.connect(location.protocol + '//' + document.domain + ':' + location.port);

取消连接,即关闭浏览器等,不用再来定义,如果想进行操作触发,可以用socket.disconnect()绑定事件
那么服务器怎么知道客户端连接上了呢?
所以在python代码中 我们要写监听函数

# 连接
@socketio.on('connect')
def handle_connect():
    username = session.get('username')
    print('*' * 20, f'{username}  connect', '*' * 20)
    socketio.emit('connect info', f'{username}  connect')

这三行代码,1.从会话中得到昵称,2.打印连接信息,3.发送一个字符串到’connect info’,这个在前段会被接收,然后在页面上显示,之后会有提及

# 断开连接
@socketio.on('disconnect')
def handle_disconnect():
    username = session.get('username')
    print('*' * 20, f'{username}  disconnect', '*' * 20)
    socketio.emit('connect info', f'{username}  disconnect')

断开连接跟连接是基本一致的
在前端的接收连接信息的监听函数如下,参数data就是传入的那个字符串,然后传建一个div元素,命名为connectInfo,在这个div中插入msg这段html,最后在聊天的区域(命名为messageBox)加入connectInfo

 // 连接的信息
 socket.on('connect info', function (data) {
     console.log(data)
     let connectInfo = document.createElement('div')
     connectInfo.className = 'row'
     let msg = `
       <div class="col s4 offset-s4">
         <div class="connect-info grey lighten-4 center" >
           <span class="black-text">${data}
           </span>
         </div>
       </div>`
     connectInfo.innerHTML = msg
     messageBox.appendChild(connectInfo)
 })

这样在前端的效果就是请添加图片描述

发送信息

给发送按钮绑定点击事件,获取到输入框中的信息,获取用户名,然后删除输入框的信息,最后用socket.emit()发送json数据(数据中有用户昵称,信息内容)到服务器,如果获取到输入框的信息是空,则弹出框

// 发送消息
sendMsgBtn.onclick = function () {
    let msg = inp.value
    let user = document.querySelector('#username').innerHTML
    inp.value = ''
    if(msg){
        socket.emit('send msg', {
            user: user,
            message: msg
        })
    }else {
        alert('消息不能为空')
    }
}

这边有一个优化使用的操作,就是给回车按键绑定点击事件

// 回车发送消息
 inp.addEventListener("keyup", function(event) {
     event.preventDefault();
     if (event.keyCode === 13) {
         sendMsgBtn.click();
     }
 });

服务器接收发送的消息,data就是前端发送过来的json数据,然后使用socket.emit()发送到前段

@socketio.on('send msg')
def handle_message(data):
    print('sendMsg' + str(data))
    socketio.emit('send msg', data)

前段接收服务器发送来的信息
插入聊天信息操作跟上面接收连接信息是基本一致的,这里面有加一个判断,即信息是否是自己发送的

// 接受消息
socket.on('send msg', function (data) {
    console.log(data)
    let msg = null
    let msgbox = document.createElement('div')
    msgbox.className = 'row'
    if (data.user === document.querySelector('#username').innerHTML) {
        msg = `
      <div class="col right">
        <div class="tag teal z-depth-3" >
          <span class="white-text">${data.message}
          </span>
        </div>
      </div>`
    } else {
        msg = `
      <div class="col">
        <div class="tag z-depth-3">
          <span class="teal-text"><b>${data.user}</b>:  ${data.message}
          </span>
        </div>
      </div>`
    }
    msgbox.innerHTML = msg
    messageBox.appendChild(msgbox)
})

总结

那这篇文章记录了我初学socketio的简单使用,以及具体的实现,代码繁琐,如有指正,感激不尽
  • 8
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
好的,我可以帮你介绍一下如何使用 Flask-RESTful 和 Flask-SocketIO 实现后端分离的聊天应用。 首先,我们需要安装 Flask-RESTful 和 Flask-SocketIO: ``` pip install flask-restful pip install flask-socketio ``` 接下来,我们需要创建一个 Flask 应用,并初始化 Flask-SocketIO: ```python from flask import Flask, jsonify from flask_restful import Api, Resource from flask_socketio import SocketIO, emit app = Flask(__name__) api = Api(app) # 初始化 Flask-SocketIO socketio = SocketIO(app, cors_allowed_origins='*') ``` 接着,我们可以创建一个 RESTful API 资源,用于向前端提供聊天室的相关信息: ```python class ChatRoom(Resource): def get(self): # 返回聊天室信息 return jsonify({ 'name': 'My Chat Room', 'description': 'A chat room for testing' }) # 添加 ChatRoom 资源 api.add_resource(ChatRoom, '/chat-room') ``` 然后,我们可以创建一个 SocketIO 的事件,用于处理前端发送过来的聊天消息: ```python @socketio.on('chat_message') def handle_chat_message(data): # 将消息广播给所有连接的客户端 emit('chat_message', data, broadcast=True) ``` 最后,我们需要在前端代码中使用 SocketIO 客户端库来连接服务器,并发送和接收聊天消息: ```javascript // 连接 SocketIO 服务器 const socket = io('http://localhost:5000'); // 发送聊天消息 socket.emit('chat_message', { 'text': 'Hello, world!', 'username': 'Alice' }); // 接收聊天消息 socket.on('chat_message', (data) => { console.log(data.username + ': ' + data.text); }); ``` 以上就是使用 Flask-RESTful 和 Flask-SocketIO 实现后端分离的聊天应用的基本步骤,你可以根据自己的实际需求进行更加详细的开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gsxdcyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值