Flask SSE: ответ EventSource имеет тип MIME («text/html»), который не является «text/event-stream». Прерывание соединениHtml

Программисты Html
Ответить
Anonymous
 Flask SSE: ответ EventSource имеет тип MIME («text/html»), который не является «text/event-stream». Прерывание соединени

Сообщение Anonymous »

Я разрабатываю серверную часть Flask, работающую в Google Colab, которая служит интерфейсом Angular для загрузки файлов .wav и получения потока сгенерированных слов через события, отправленные сервером (SSE).
Проблема:
Когда интерфейс пытается подключиться к конечной точке SSE, я получаю следующую ошибку в консоли браузера:

Ответ EventSource имеет тип MIME ("text/html"), который не является
"text/event-stream". Прерывание соединения.

Это код внешнего интерфейса

Код: Выделить всё

Upload



async function uploadFile() {
const fileInput = document.getElementById('fileInput');
const statusDiv = document.getElementById('status');
const outputDiv = document.getElementById('output');

if (!fileInput.files.length) {
statusDiv.textContent = "Please select a file";
return;
}

const file = fileInput.files[0];
const formData = new FormData();
formData.append("file", file);

try {
statusDiv.textContent = "Uploading...";

const response = await fetch("https:///upload", {
method: "POST",
body: formData
});

const result = await response.json();
if (response.ok) {
statusDiv.textContent = "Upload successful! Receiving text...";

const sessionId = result.session_id;
const eventSource = new EventSource(`https:///stream/${sessionId}`);

eventSource.onmessage = (e) => {
outputDiv.innerHTML += `${e.data}`;
};

eventSource.onerror = (e) => {
console.error("SSE error", e);
eventSource.close();
};
} else {
statusDiv.textContent = result.error;
}
} catch (error) {
statusDiv.textContent = "Upload failed: " + error.message;
}
}


Это внутренний код

Код: Выделить всё

from flask import Flask, request, jsonify, Response
import os, threading, random, time, uuid, queue
from flask_cors import CORS
from pyngrok import ngrok

app = Flask(__name__)
CORS(app)

UPLOAD_FOLDER = "/content/uploads"
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

sessions = {}

WORDS = ["apple", "banana", "cherry", "dog", "elephant", "fox"]

def generate_random_words(q):
"""Generates words into a queue"""
for _ in range(10):
word = random.choice(WORDS)
q.put(word)
time.sleep(1)
q.put(None)

@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return jsonify({"error": "No file part"}), 400

file = request.files['file']
if file.filename == '':
return jsonify({"error": "No selected file"}), 400

file_path = os.path.join(UPLOAD_FOLDER, file.filename)
file.save(file_path)

session_id = str(uuid.uuid4())
q = queue.Queue()
sessions[session_id] = q

threading.Thread(target=generate_random_words, args=(q,)).start()

return jsonify({"session_id": session_id}), 200

@app.route('/stream/')
def stream(session_id):
def event_stream():
q = sessions.get(session_id)
if not q:
yield "event: error\ndata: Session expired\n\n"
return

while True:
word = q.get()
if word is None:
del sessions[session_id]
yield "event: end\ndata: stream ended\n\n"
break
yield f"data: {word}\n\n"

return Response(event_stream(), mimetype="text/event-stream", headers={'X-Accel-Buffering': 'no'})

def run_ngrok():
ngrok.set_auth_token("YOUR_NGROK_AUTH_TOKEN")
public_url = ngrok.connect(5000).public_url
print(f" * Public URL: {public_url}")

if __name__ == '__main__':
threading.Thread(target=run_ngrok).start()
app.run(host='0.0.0.0', port=5000)



Подробнее здесь: https://stackoverflow.com/questions/793 ... is-not-tex
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Html»