# Streamlit Spaces

**Streamlit** позволяет пользователям свободно создавать полнофункциональные веб-приложения на Python в *реактивном* режиме. Ваш код выполняется заново каждый раз, когда изменяется состояние приложения. Streamlit также отлично подходит для визуализации данных и поддерживает несколько библиотек построения графиков, таких как Bokeh, Plotly и Altair. Прочитайте эту [статью в блоге](https://huggingface.co/blog/streamlit-spaces) о создании и размещении приложений Streamlit в Spaces.

Выбор **Streamlit** в качестве SDK при [создании нового Space](https://huggingface.co/new-space) инициализирует ваш Space с последней версией Streamlit, задавая свойство `sdk` значением `streamlit` в YAML-блоке вашего файла `README.md`. Если вы хотите изменить версию Streamlit, отредактируйте свойство `sdk_version`.

Чтобы использовать Streamlit в Space, выберите **Streamlit** в качестве SDK при создании Space через форму [**New Space**](https://huggingface.co/new-space). Это создаст репозиторий с файлом `README.md`, содержащим следующие свойства в блоке конфигурации YAML:

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

Вы можете изменить `sdk_version`, но имейте в виду, что при использовании неподдерживаемой версии Streamlit могут возникать проблемы. Не все версии Streamlit поддерживаются, поэтому обратитесь к [разделу со справочной информацией](./spaces-config-reference), чтобы узнать, какие версии доступны.

Подробную информацию о Streamlit см. в [документации Streamlit](https://docs.streamlit.io/).

> [!WARNING]
> Для Spaces на базе Streamlit разрешён только порт 8501 (порт по умолчанию). Поэтому, если вы предоставляете файл `config.toml` для вашего Space, убедитесь, что порт по умолчанию не переопределяется.

## Ваше первое пространство Streamlit: классификатор хот-догов

В следующих разделах вы узнаете основы создания Space, его настройки и развёртывания вашего кода. Мы создадим Space **Hot Dog Classifier** на Streamlit, который будет использоваться для демонстрации модели [julien-c/hotdog-not-hotdog](https://huggingface.co/julien-c/hotdog-not-hotdog), способной определять, содержит ли изображение хот-дог 🌭

Готовую версию этого приложения можно найти в репозитории [NimaBoscarino/hotdog-streamlit](https://huggingface.co/spaces/NimaBoscarino/hotdog-streamlit).

## Создать новое пространство Streamlit

Мы начнём с [создания нового Space](https://huggingface.co/new-space) и выбора **Streamlit** в качестве SDK. Hugging Face Spaces — это Git-репозитории, что означает возможность работать над Space поэтапно (и совместно) путём отправки коммитов. Ознакомьтесь с руководством [Getting Started with Repositories](./repositories-getting-started), чтобы узнать, как создавать и редактировать файлы, прежде чем продолжить.

## Добавьте зависимости

Для **Hot Dog Classifier** мы будем использовать [🤗 Transformers pipeline](https://huggingface.co/docs/transformers/pipeline_tutorial) для работы с моделью, поэтому сначала нужно установить несколько зависимостей. Это можно сделать, создав файл **requirements.txt** в нашем репозитории и добавив в него следующие зависимости:

```
transformers
torch
```

Среда выполнения Spaces сама установит зависимости!

## Создайте приложение Streamlit

Чтобы создать приложение Streamlit, создайте новый файл в репозитории с именем **app.py** и добавьте следующий код:

```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)}%")
```

Этот Python-скрипт использует [🤗 Transformers pipeline](https://huggingface.co/docs/transformers/pipeline_tutorial) для загрузки модели [julien-c/hotdog-not-hotdog](https://huggingface.co/julien-c/hotdog-not-hotdog), которая применяется в интерфейсе Streamlit. Приложение Streamlit будет ожидать от вас загрузку изображения, которое затем будет классифицировано как *hot dog* или *not hot dog*. После сохранения кода в файл **app.py** перейдите на вкладку **App**, чтобы увидеть работу вашего приложения!

## Встраивание Streamlit Spaces на другие веб-страницы

Вы можете использовать HTML-тег `<iframe>` для встраивания Streamlit Space в виде inline-кадра на другие веб-страницы. Просто укажите URL вашего Space, заканчивающийся суффиксом `.hf.space`. Чтобы найти URL вашего Space, используйте кнопку "Embed this Space" в настройках Spaces.

Например, демо выше можно встроить в эти документы с помощью следующего тега:

```
<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="Streamlit app" 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"
>

Обратите внимание, что мы добавили `?embed=true` в URL, что активирует режим встраивания приложения Streamlit, убирая некоторые отступы и нижнюю часть страницы для компактного встраивания.

## Встраивание Streamlit Spaces с автоматически изменяющимися по размеру IFrames

Streamlit поддерживает автоматическое изменение размера iframe с версии [1.17.0](https://docs.streamlit.io/library/changelog#version-1170), благодаря чему размер родительского iframe автоматически подстраивается под объём содержимого встроенного приложения Streamlit.

Он использует библиотеку [`iFrame Resizer`](https://github.com/davidjbradshaw/iframe-resizer), для которой необходимо добавить несколько строк кода, как в следующем примере, где

- `id` устанавливается в `<iframe />`, который используется для указания цели автоматического изменения размера.
- `iFrame Resizer` загружается через тег `script`.
- Функция `iFrameResize()` вызывается с идентификатором целевого элемента `iframe`, чтобы его размер менялся автоматически.

Мы можем передать параметры в первый аргумент `iFrameResize()`. Подробности см. в [документации](https://github.com/davidjbradshaw/iframe-resizer/blob/v4/docs/parent_page/options.md).

```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>
```

Кроме того, вы можете ознакомиться с [нашей документацией](./spaces-embed).

