400 Bad Request при развертывании в модальном (бессерверном контейнере).
Вот соответствующая настройка:
streamlit_app.py
Код: Выделить всё
import streamlit as st
from ultralytics import YOLO
import tempfile, os
from dotenv import load_dotenv
load_dotenv("/root/.env")
os.environ["TMPDIR"] = "/tmp"
tempfile.tempdir = "/tmp"
st.title("🦺 PPE Detection App")
uploaded_file = st.file_uploader("Upload an image", type=["jpg", "png"])
if uploaded_file:
temp_path = os.path.join(tempfile.gettempdir(), uploaded_file.name)
with open(temp_path, "wb") as f:
f.write(uploaded_file.read())
model = YOLO("/root/best.pt")
results = model.predict(source=temp_path, save=True, project="/tmp", name="detections")
st.success("✅ Detection complete!")
Код: Выделить всё
import modal, shlex, subprocess
from pathlib import Path
image = (
modal.Image.debian_slim(python_version="3.12")
.apt_install("libgl1", "libglib2.0-0", "ffmpeg")
.uv_pip_install("streamlit", "ultralytics", "opencv-python", "supabase", "python-dotenv")
.add_local_file("src/streamlit_app.py", "/root/streamlit_app.py")
.add_local_file("../.env", "/root/.env")
)
app = modal.App(name="ppe-detection", image=image)
@app.function()
@modal.web_server(8000)
def run():
subprocess.Popen(
"streamlit run /root/streamlit_app.py --server.port 8000 --server.enableCORS=false",
shell=True,
)
Код: Выделить всё
PUT /_stcore/upload_file// -> 400 Bad Request- Проверил, что работает локально при запуске с потоковым запуском.
- Установите os.environ["TMPDIR"] = "/tmp" и обеспечьте вывод YOLO в /tmp.
- Подтверждено, что .env и вес модели загружаются правильно.
- Добавлены разрешения на запись для /tmp внутри модала.
Как я могу успешно использовать st.file_uploader() при развертывании Modal?
Ограничивает ли Modal загрузку файлов через внутренний API Streamlit или мне нужно настроить временный каталог Streamlit по-другому?>
Подробнее здесь: https://stackoverflow.com/questions/797 ... odal-works