# Espaces Streamlit

**Streamlit** offre aux utilisateurs la liberté de créer une application web complète avec Python de manière *réactive*. Votre code est réexécuté à chaque changement d’état de l’application. Streamlit est également idéal pour la visualisation de données et prend en charge plusieurs bibliothèques de graphiques, telles que Bokeh, Plotly et Altair. Lisez cet [article de blog](https://huggingface.co/blog/streamlit-spaces) sur la création et l’hébergement d’applications Streamlit dans Spaces.

Sélectionner **Streamlit** comme SDK lors de la [création d'un nouvel espace](https://huggingface.co/new-space) initialise votre espace avec la dernière version de Streamlit en définissant la propriété `sdk` sur `streamlit` dans le bloc YAML de votre fichier `README.md`. Si vous souhaitez modifier la version de Streamlit, vous pouvez éditer la propriété `sdk_version`.

Pour utiliser Streamlit dans un Space, sélectionnez **Streamlit** comme SDK lors de la création d'un Space via le formulaire [**Nouveau Space**](https://huggingface.co/new-space). Cela crée un dépôt avec un `README.md` contenant les propriétés suivantes dans le bloc de configuration YAML :

```yaml
sdk: streamlit
sdk_version: 1.25.0 # The latest supported version
```

Vous pouvez modifier le `sdk_version`, mais notez que des problèmes peuvent survenir si vous utilisez une version de Streamlit non prise en charge. Toutes les versions de Streamlit ne sont pas supportées, veuillez donc consulter la [section de référence](./spaces-config-reference) pour voir quelles versions sont disponibles.

Pour des informations détaillées sur Streamlit, reportez-vous à la [documentation Streamlit](https://docs.streamlit.io/).

> [!WARNING]
> Seul le port 8501 est autorisé pour les Spaces Streamlit (port par défaut). Par conséquent, si vous fournissez un fichier `config.toml` pour votre Space, assurez-vous que le port par défaut n'est pas remplacé.

## Votre premier espace Streamlit : classifieur de hot-dogs

Dans les sections suivantes, vous apprendrez les bases de la création d'un Space, de sa configuration et du déploiement de votre code dessus. Nous allons créer un Space **Hot Dog Classifier** avec Streamlit qui servira à démontrer le modèle [julien-c/hotdog-not-hotdog](https://huggingface.co/julien-c/hotdog-not-hotdog), capable de détecter si une image donnée contient un hot dog 🌭

Vous pouvez trouver une version complétée de ce projet hébergée sur [NimaBoscarino/hotdog-streamlit](https://huggingface.co/spaces/NimaBoscarino/hotdog-streamlit).

## Créer un nouvel espace Streamlit

Nous commencerons par [créer un nouvel espace](https://huggingface.co/new-space) et en choisissant **Streamlit** comme SDK. Les espaces Hugging Face sont des dépôts Git, ce qui signifie que vous pouvez travailler sur votre espace de manière incrémentale (et collaborative) en poussant des commits. Consultez le guide [Prise en main des dépôts](./repositories-getting-started) pour apprendre à créer et modifier des fichiers avant de continuer.

## Ajouter les dépendances

Pour le **Hot Dog Classifier**, nous utiliserons un [🤗 Transformers pipeline](https://huggingface.co/docs/transformers/pipeline_tutorial) pour exploiter le modèle, il nous faut donc commencer par installer quelques dépendances. Cela peut se faire en créant un fichier **requirements.txt** dans notre dépôt et en y ajoutant les dépendances suivantes :

```
transformers
torch
```

Le runtime Spaces s’occupera d’installer les dépendances !

## Créer l’application Streamlit

Pour créer l'application Streamlit, créez un nouveau fichier dans le dépôt nommé **app.py** et ajoutez le code suivant :

```python
import streamlit as st
from transformers import pipeline
from PIL import Image

pipeline = pipeline(task="image-classification", model="julien-c/hotdog-not-hotdog")

st.title("Hot Dog? Or Not?")

file_name = st.file_uploader("Upload a hot dog candidate image")

if file_name is not None:
    col1, col2 = st.columns(2)

    image = Image.open(file_name)
    col1.image(image, use_column_width=True)
    predictions = pipeline(image)

    col2.header("Probabilities")
    for p in predictions:
        col2.subheader(f"{ p['label'] }: { round(p['score'] * 100, 1)}%")
```

Ce script Python utilise un [🤗 Transformers pipeline](https://huggingface.co/docs/transformers/pipeline_tutorial) pour charger le modèle [julien-c/hotdog-not-hotdog](https://huggingface.co/julien-c/hotdog-not-hotdog), utilisé par l'interface Streamlit. L'application Streamlit s'attend à ce que vous téléversiez une image, qu'elle classera ensuite en *hot dog* ou *not hot dog*. Une fois que vous avez enregistré le code dans le fichier **app.py**, visitez l'onglet **App** pour voir votre application en action !

## Intégrer des Spaces Streamlit dans d'autres pages web

Vous pouvez utiliser la balise HTML `<iframe>` pour intégrer un Space Streamlit en tant que cadre en ligne sur d'autres pages web. Il suffit d'inclure l'URL de votre Space, qui se termine par le suffixe `.hf.space`. Pour trouver l'URL de votre Space, vous pouvez utiliser le bouton « Intégrer ce Space » dans les options des Spaces.

Par exemple, la démonstration ci-dessus peut être intégrée dans cette documentation avec la balise suivante :

```
<iframe
  src="https://NimaBoscarino-hotdog-streamlit.hf.space?embed=true"
  title="My awesome Streamlit Space"
></iframe>
```

<iframe src="https://NimaBoscarino-hotdog-streamlit.hf.space?embed=true" frameborder="0" height="364" title="Application Streamlit" class="container p-0 grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"
>

Veuillez noter que nous avons ajouté `?embed=true` à l’URL, ce qui active le mode d’intégration de l’application Streamlit, supprimant certains espaces et le pied de page pour des intégrations plus fines.

## Intégrer des Spaces Streamlit avec des iFrames à redimensionnement automatique

Streamlit prend en charge le redimensionnement automatique des iframes depuis la version [1.17.0](https://docs.streamlit.io/library/changelog#version-1170), de sorte que la taille de l'iframe parente est automatiquement ajustée pour s'adapter au volume de contenu de l'application Streamlit intégrée.

Elle s’appuie sur la bibliothèque [`iFrame Resizer`](https://github.com/davidjbradshaw/iframe-resizer), pour laquelle vous devez ajouter quelques lignes de code, comme dans l’exemple suivant où

- `id` est défini sur `<iframe />`, qui est utilisé pour spécifier la cible du redimensionnement automatique.
- Le `iFrame Resizer` est chargé via la balise `script`.
- La fonction `iFrameResize()` est appelée avec l'identifiant de l'élément `iframe` cible, afin que sa taille change automatiquement.

Nous pouvons passer des options au premier argument de `iFrameResize()`. Consultez [la documentation](https://github.com/davidjbradshaw/iframe-resizer/blob/v4/docs/parent_page/options.md) pour plus de détails.

```html
<iframe
	id="your-iframe-id"
	src="https://<space-subdomain>.hf.space"
	frameborder="0"
	width="850"
	height="450"
></iframe>
<script src="https://cdn.jsdelivr.net/npm/iframe-resizer@4.3.4/js/iframeResizer.min.js"></script>
<script>
  iFrameResize({}, "#your-iframe-id")
</script>
```

De plus, vous pouvez consulter [notre documentation](./spaces-embed).

