0
点赞
收藏
分享

微信扫一扫

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

 参考链接:
            # Flask websocket
      https://cloud.tencent.com/developer/article/2202076   # Flask框架:运用SocketIO实现WebSSH



举报

相关推荐

0 条评论