#!/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