m7n's picture
Update main.py
8d0bb7b verified
###############################################################################
# 1) Set environment variables BEFORE importing Gradio (if you actually need them).
# In many cases, you can omit these entirely.
###############################################################################
import os
# If you want Gradio to run on a particular host/port, you can do this:
os.environ["GRADIO_SERVER_NAME"] = "0.0.0.0"
os.environ["GRADIO_SERVER_PORT"] = "7860"
# If you do NOT really need GRADIO_ROOT_PATH, don’t set it.
# If you do set it, do so BEFORE the Gradio import, e.g.:
os.environ["GRADIO_ROOT_PATH"] = "/_app/immutable"
###############################################################################
# 2) Now import everything
###############################################################################
import time
import json
import base64
from datetime import datetime
from pathlib import Path
import gradio as gr
from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
import uvicorn
# Hugging Face Spaces
import spaces
from spaces.zero.client import _get_token
###############################################################################
# 3) Create your FastAPI app and (optionally) mount a static folder for user files
###############################################################################
app = FastAPI()
static_dir = Path("./static")
static_dir.mkdir(parents=True, exist_ok=True)
app.mount("/static", StaticFiles(directory="static"), name="static")
###############################################################################
# 4) Define your GPU function and main processing function
###############################################################################
@spaces.GPU(duration=240) # specify GPU usage for 4 minutes
def process_text(text):
"""Simulate a GPU-based process."""
time.sleep(10)
return text.upper()
def process_and_save(request: gr.Request, text: str):
"""Handles GPU call and writes result to a file in ./static."""
token = _get_token(request)
payload = token.split(".")[1]
payload = f"{payload}{'=' * ((4 - len(payload) % 4) % 4)}"
payload = json.loads(base64.urlsafe_b64decode(payload).decode())
print(f"Token payload: {payload}")
result = process_text(text)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
file_path = static_dir / f"output_{timestamp}.txt"
with open(file_path, "w") as f:
f.write(result)
return gr.File(value=str(file_path))
# Mark as not requiring GPU
process_and_save.zerogpu = True
###############################################################################
# 5) Build the Gradio Blocks interface
###############################################################################
with gr.Blocks() as demo:
text_input = gr.Textbox(label="Enter some text")
submit_btn = gr.Button("Process and Download")
output = gr.File(label="Download Processed File")
submit_btn.click(
fn=process_and_save,
inputs=[text_input],
outputs=output
)
###############################################################################
# 6) Mount the Gradio app WITH SSR. Don’t manually mount _app/immutable.
###############################################################################
app = gr.mount_gradio_app(app, demo, path="/", ssr_mode=False)
###############################################################################
# 7) Run with Uvicorn
###############################################################################
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)