我想在服务器中上传文件并对该文件执行操作。我正在使用Flask
来渲染模板,该模板显示用于选择文件并使用后期操作上传的表单。我还使用websockets
在服务器和客户端之间进行通信。我想做的是:
目前,正在发生的事情是python upload_file
函数要求我返回诸如“文件已成功上传”之类的内容,这正在改变视图。如果我从那里重定向到index.html,则会创建一个新会话。(我在这里可能是错误的)
index.html的内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Flask SocketIO Test</title>
</head>
<body>
<p>Anacall</p>
<form action="/upload" method="POST"
enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit"/>
</form>
<br>
<p id="status">Status</p>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<script type="text/javascript" charset="utf-8">
var socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('connect', function() {
socket.emit('get_status')
console.log('Websocket connected!');
});
socket.on('response_status',function(){
document.getElementById("status").innerHTML = "Status : File Status";
console.log("response received");
});
</script>
</body>
</html>
python文件的内容:
from flask import Flask, render_template, request, redirect, url_for
from flask_socketio import SocketIO, emit
from werkzeug import secure_filename
app = Flask(__name__)
socketio = SocketIO(app)
UPLOAD_FOLDER = '/static'
ALLOWED_EXTENSIONS = set(['xlsx', 'txt'])
status = None
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/')
def index():
return render_template('index.html')
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
if 'file' not in request.files:
return 'No file selected'
file = request.files['file']
if file.filename == '':
return "No file selected"
if file and allowed_file(file.filename):
file.save(secure_filename("file.xlsx")) # saves in current directory
status = "File uploaded"
return redirect(url_for('index'))
@socketio.on('get_status')
def send_status():
print("Send status now")
if (status != None):
emit("response_status")
if __name__ == '__main__':
socketio.run(app, host='10.131.65.115', port=12000)
答案 0 :(得分:0)
你是对的。每次重新加载页面时,WebSocket连接都会关闭并再次重新打开。要摆脱这种情况,您必须使用会话cookie等对会话进行身份验证。
但是您可以在 upload_file -python文件的方法中编写 return('',204)。这告诉客户端(浏览器)没有内容。然后,可以在iFrame中实现“上传”操作。
但是我建议您使用DropzoneJS。
烧瓶示例: