Guillaume Raille
Fix OAuth token handling in create_user_space function
74d172e unverified
import gradio as gr
from huggingface_hub import HfApi, create_repo
from huggingface_hub.utils import RepositoryNotFoundError
import os
def create_interface():
"""Create the Gradio interface with OAuth login."""
with gr.Blocks(title="HF Space Creator") as demo:
gr.Markdown("# Hugging Face Space Creator")
gr.Markdown("Login with your Hugging Face account to create a private space.")
# OAuth login
login_btn = gr.LoginButton()
# User info display
user_info = gr.Markdown("")
# Space creation section (initially hidden)
with gr.Column(visible=False) as create_section:
gr.Markdown("### Create a New Private Space")
space_name_input = gr.Textbox(
label="Space Name",
placeholder="my-awesome-space",
info="Enter a name for your new private space (lowercase, no spaces)"
)
create_btn = gr.Button("Create Private Space", variant="primary")
create_status = gr.Markdown("")
def create_user_space(space_name: str, oauth_token: gr.OAuthToken | None) -> str:
"""Create a private Hugging Face space for the user."""
if not oauth_token:
return "❌ Please login first!"
try:
# Use the OAuth token
token = oauth_token.token
if not token:
return "❌ No access token found. Please login again."
api = HfApi(token=token)
# Get the current user's username
user_info = api.whoami()
username = user_info["name"]
# Create a private space repository
repo_id = f"{username}/{space_name}"
# Check if the space already exists
try:
api.repo_info(repo_id, repo_type="space")
return f"❌ Space '{repo_id}' already exists!"
except RepositoryNotFoundError:
# Space doesn't exist, we can create it
pass
# Create the space
url = create_repo(
repo_id=repo_id,
repo_type="space",
space_sdk="gradio",
private=True,
token=token
)
# Create a simple app.py file for the new space
app_content = '''import gradio as gr
def greet(name):
return f"Hello {name}! This is your private space."
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
if __name__ == "__main__":
demo.launch()
'''
api.upload_file(
path_or_fileobj=app_content.encode(),
path_in_repo="app.py",
repo_id=repo_id,
repo_type="space",
token=token
)
return f"βœ… Successfully created private space: {url}"
except Exception as e:
return f"❌ Error creating space: {str(e)}"
def update_ui(profile: gr.OAuthProfile | None) -> tuple:
"""Update UI based on login status."""
if profile:
# OAuthProfile has username attribute
username = profile.username
return (
f"βœ… Logged in as **{username}**",
gr.update(visible=True)
)
else:
return (
"",
gr.update(visible=False)
)
# Update UI when login state changes
demo.load(update_ui, inputs=None, outputs=[user_info, create_section])
# Create space button click - use oauth_token parameter
create_btn.click(
fn=create_user_space,
inputs=[space_name_input],
outputs=[create_status]
)
return demo
def main():
# Check if running in Hugging Face Spaces
if os.getenv("SPACE_ID"):
# Running in Spaces, launch with appropriate settings
demo = create_interface()
demo.launch()
else:
# Running locally, note that OAuth won't work
print("Note: OAuth login only works when deployed to Hugging Face Spaces.")
print("To test locally, deploy this as a Space with hf_oauth: true in README.md")
demo = create_interface()
demo.launch()
if __name__ == "__main__":
main()