radames's picture
Update app.py
95fb820
raw
history blame
2.93 kB
import pandas as pd
import gradio as gr
from fastapi import FastAPI, Request
import uvicorn
from pathlib import Path
import os
HF_TOKEN = os.environ.get("HF_TOKEN")
FLAG_DIR = Path("./flagged_data")
DATASET_NAME = "gradio_clicks_dataset"
# https://huggingface.co/datasets/radames/gradio_clicks_dataset
# setup logger
# remote logging to HuggingFace
remote = True
logger = gr.CSVLogger()
if remote:
logger = gr.HuggingFaceDatasetSaver(
HF_TOKEN, dataset_name=DATASET_NAME, organization=None, private=False)
logger.setup([gr.Text(label="URL"), gr.Text(label="Host")], FLAG_DIR)
# dummy data
websites = [
["https://www.google.com/"],
["https://www.youtube.com/"],
["https://www.facebook.com/"],
["https://www.wikipedia.org/"],
["https://www.amazon.com/"],
["https://www.yahoo.com/"],
["https://www.twitter.com/"],
["https://www.instagram.com/"],
["https://www.reddit.com/"],
["https://www.linkedin.com/"],
["https://www.netflix.com/"],
["https://www.microsoft.com/"],
["https://www.apple.com/"],
["https://www.zoom.us/"],
["https://www.gmail.com/"],
["https://www.dropbox.com/"],
["https://www.github.com/"],
["https://www.stackoverflow.com/"],
["https://www.medium.com/"],
["https://www.quora.com/"],
]
# add simple get request for tracking
websites = [
[f"<a href={x[0]} target='_blank' onclick='fetch(\"/track?url={x[0]}\")'>{x[0]}</a>"] for x in websites]
df = pd.DataFrame(websites, columns=['img_code'])
df_html = df.to_html(escape=False, render_links=False,
index=False, header=False)
# create a FastAPI app
app = FastAPI()
# gradio app
def refresh():
df = pd.read_csv(FLAG_DIR / DATASET_NAME / "data.csv")
url_counts = df.groupby('URL').count()['Host']
normalized_counts = url_counts / url_counts.sum()
return normalized_counts.to_dict()
with gr.Blocks() as block:
gr.Markdown("""
## Gradio Tracking Clicks + FastAPI + HuggingFace Datasets
This is a demo of how to track clicks on a Gradio app using FastAPI and HuggingFace Datasets.
Each click sends a request to the FastAPI server, which logs the click to a HuggingFace dataset.
""")
with gr.Row():
with gr.Column():
refresh_bt = gr.Button("Refresh")
gr.HTML(df_html)
with gr.Column():
labels = gr.Label()
refresh_bt.click(fn=refresh, inputs=[], outputs=[labels])
block.load(fn=refresh, inputs=[], outputs=[labels])
# custom get request handler to flag clicks
@ app.get("/track")
async def track(url: str, request: Request):
# host disable for privacy reasons
# host = request.headers.get("host")
logger.flag([url, "ip"])
return {"message": "ok"}
# mount Gradio app to FastAPI app
app = gr.mount_gradio_app(app, block, path="/")
# serve the app
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=7860)