flask websocket
#!/usr/bin/python3 # -*- coding:utf-8 -*- from gevent import monkey # 解决requests post请求递归次数太多的问题,一定要在导入gevent模块前导入 monkey.patch_all() from gevent import pywsgi from geventwebsocket.handler import WebSocketHandler from flask_uwsgi_websocket import GeventWebSocket from flask import Flask, render_template, redirect, request, session, jsonify from concurrent.futures import ThreadPoolExecutor import zipfile, os from werkzeug.utils import secure_filename from conndb import condb import subprocess app = Flask(__name__) app.secret_key = '123456' # sockets = Sockets(app) sockets = GeventWebSocket(app) ''' 解压缩zip文件 基本格式:zipfile.ZipFile(filename[,mode[,compression[,allowZip64]]]) mode:可选 r,w,a 代表不同的打开文件的方式;r 只读;w 重写;a 添加 compression:指出这个 zipfile 用什么压缩方法,默认是 ZIP_STORED,另一种选择是 ZIP_DEFLATED; allowZip64:bool型变量,当设置为True时可以创建大于 2G 的 zip 文件,默认值 True; ''' def unzip(path, folder_abs): zip_file = zipfile.ZipFile(path) zip_list = zip_file.namelist() # 得到压缩包里所有文件 for f in zip_list: zip_file.extract(f, folder_abs) # 循环解压文件到指定目录 zip_file.close() # 关闭文件,必须有,释放内存 os.remove(path) def savefile(f, savepath): basepath = os.path.dirname(__file__) upload_path = os.path.join(basepath, savepath, secure_filename(f.filename)) f.save(upload_path) unzip(upload_path, savepath) @app.route('/', methods=['GET', 'POST']) def index(): logins = False if session.get('user_info'): logins = True if request.method == "POST": table = request.values.get('table') list, list_all = condb('SELECT * FROM `{}` ORDER BY id DESC;'.format(table)) return jsonify(list_all) list, list_all = condb('SELECT * FROM `uploadinfo` ORDER BY id DESC;') return render_template('index.html', list_all=list_all, logins=logins) @app.route('/script', methods=['POST', 'GET']) def script(): if session.get('user_info'): if request.method == 'POST': pool = ThreadPoolExecutor(1) f = request.files['file'] pool.submit(savefile, f, 'static/uploadfile') return render_template('uploadfile.html') return render_template('script.html') return redirect('/') @sockets.route('/websocket') def websocket(ws): message = ws.receive() resu = message.decode('utf-8') if message: res = subprocess.Popen(resu, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) resul = res.stdout.read().decode('utf-8') reserr = res.stderr.read().decode('utf-8') ws.send(resul + '\n<div style="color: red">错误消息:</div>' + reserr) if __name__ == '__main__': server = pywsgi.WSGIServer(('172.17.0.2', 5000), app, handler_class=WebSocketHandler) server.serve_forever()
解决使用requests模块发送post请求时报递归次数太多的问题,一定要在导入gevent模块前导入
from gevent import monkey monkey.patch_all() from gevent import pywsgi
requirements.txt文件
Flask==1.1.4 Flask_uWSGI_WebSocket==0.6.1 gevent==21.8.0 gevent_websocket==0.10.1 ldap3==2.9.1 paramiko==2.8.0 Pillow==9.1.0 PyMySQL==1.0.2 requests==2.26.0 six==1.16.0 Werkzeug==1.0.1
参考链接:
https://www.cnblogs.com/py-web/p/12016495.html # Flask websocket
https://cloud.tencent.com/developer/article/2202076 # Flask框架:运用SocketIO实现WebSSH
浙公网安备 33010602011771号