Comment exécuter des applications Streamlit sur le port 80
Updated on
Streamlit est un outil puissant qui permet aux développeurs de créer des applications web interactives avec un minimum de tracas. Cependant, il n'est pas sans défis, notamment en ce qui concerne la configuration. Un problème couramment rencontré est l'exécution d'applications sur le port 80. Dans ce guide complet, nous explorons le sujet en nous appuyant sur les expériences des utilisateurs, les connaissances des experts et des exemples concrets pour vous aider à relever ce défi en toute confiance.
Vous souhaitez créer gratuitement une application d'analyse de données et de visualisation de données avec Streamlit ?
PyGWalker (opens in a new tab) est une bibliothèque Python qui vous permet d'intégrer facilement une interface utilisateur similaire à Tableau dans votre propre application Streamlit, sans effort. Regardez cette vidéo incroyable réalisée par Cómo explorar datos con PyGWalker en Python (opens in a new tab) qui démontre les étapes détaillées pour renforcer votre application Streamlit avec cette puissante bibliothèque de visualisation de données en Python !
Un grand merci à Sven et à sa contribution exceptionnelle (opens in a new tab) à la communauté PyGWalker !
De plus, vous pouvez également consulter la page GitHub de PyGWalker (opens in a new tab) pour plus d'exemples de PyGWalker.
Partie 1 : Le défi de la configuration de Streamlit pour s'exécuter sur le port 80
En mai 2022, un utilisateur de la communauté Streamlit, nommé Nom_ji, a rencontré un problème lors de la tentative d'exécution d'une application sur le port 80. Malgré le suivi des étapes de configuration appropriées, telles que détaillées dans la documentation officielle de Streamlit, Nom_ji a rencontré une PermissionError: [Errno 13]
lors du déploiement de l'application sur le port 80.
Il est intéressant de noter que l'application fonctionnait parfaitement sur les ports 8051 et 8080. Cela nous amène au premier point clé :
- Tous les ports ne sont pas créés égaux. Les ports inférieurs à 1024, y compris le port 80, sont considérés comme privilégiés dans les systèmes d'exploitation de type Unix et nécessitent généralement un accès superutilisateur (ou root).
En réponse au problème de Nom_ji, Randyzwitch, l'ancien responsable des relations avec les développeurs chez Streamlit, a suggéré de vérifier si le port 80 n'était pas déjà occupé par une autre instance. Vous pouvez vérifier l'existence d'instances en cours sur un port en utilisant la commande netstat
dans le terminal :
sudo netstat -tuln | grep :80
Cette commande listera tous les services actuellement en cours d'exécution sur le port 80. Si la commande renvoie une sortie, cela signifie que le port 80 est déjà utilisé et vous devrez arrêter l'autre service avant de pouvoir exécuter votre application Streamlit sur ce port.
Partie 2 : Approfondissement de l'attribution des ports dans Streamlit
Un autre problème que les utilisateurs de Streamlit peuvent rencontrer est l'exécution simultanée de plusieurs applications Streamlit, chacune nécessitant son propre port. BeyondMyself, modérateur de la communauté Streamlit, a proposé une solution simple à cela : spécifier le paramètre --server.port
lors du démarrage de l'application.
Par exemple, la commande streamlit run myapp.py --server.port 8080
exécutera l'application Streamlit définie dans myapp.py
sur le port 8080. Vous pouvez utiliser n'importe quel numéro de port disponible à la place de 8080, à condition qu'il ne soit pas déjà utilisé.
Ainsi, lorsque vous prévoyez d'exécuter plusieurs applications Streamlit, veillez à :
- Attribuer des numéros de port uniques à chaque application.
- Vérifier que le port choisi n'est pas déjà utilisé par un autre service.
Partie 3 : Faire en sorte que les applications Streamlit semblent s'exécuter sur des ports standards
Bien que vous puissiez choisir d'exécuter vos applications Streamlit sur n'importe quel port disponible, il peut arriver que vous souhaitiez que l'application semble s'exécuter sur un port standard (comme le port 80) lorsqu'elle est accédée via un domaine. C'est là que le concept de proxy inverse entre en jeu.
Un proxy inverse peut rediriger les demandes d'un serveur web, comme Apache ou Nginx, vers le port sur lequel votre application Streamlit s'exécute. Cela peut être configuré de plusieurs manières :
- Rediriger toutes les demandes de votre domaine vers votre application Streamlit.
- Configurer votre serveur web pour rediriger les demandes de sous-répertoires spécifiques vers différentes applications Streamlit.
Par exemple, si vous avez plusieurs applications Streamlit s'exécutant sur différents ports, vous pourriez rediriger mondomaine.com/app1
vers l'application Streamlit s'exécutant sur le port 8000 et mondomaine.com/app2
vers l'application sur le port 8080. Cette configuration donne l'impression que les applications s'exécutent sur le port 80 du point de vue de l'utilisateur.
Partie 4 : Définir un numéro de port fixe pour les applications Streamlit
Enfin, vous voudrez peut-être fixer le numéro de port pour vos applications Streamlit, ce qui vous permet de partager un lien stable avec les membres de votre équipe ou les utilisateurs. C'est là que le fichier ./streamlit/config.toml
entre en jeu.
Dans le fichier config.toml
, vous pouvez spécifier le numéro de port fixe. Par exemple :
[server]
port = 8501
Cette configuration indique à Streamlit d'utiliser toujours le port 8501 lors de l'exécution de votre application. Notez que ce port ne doit pas être utilisé par un autre service, sinon l'application échouera.
En résumé :
- Assurez-vous d'avoir un accès superutilisateur pour les ports privilégiés.
- Vérifiez l'existence d'instances sur un port à l'aide de
netstat
. - Utilisez le paramètre
--server.port
pour exécuter plusieurs applications. - Utilisez des proxies inverses pour que les applications semblent s'exécuter sur le port 80.
- Utilisez le fichier
config.toml
pour fixer le numéro de port.
Partie 5 : Gérer les erreurs courantes
Malgré le suivi des étapes décrites, vous pouvez encore rencontrer des erreurs, telles que l'erreur "le port est réservé". Cette erreur apparaît généralement lorsque un autre processus ne s'est pas arrêté correctement ou qu'autre chose s'exécute sur le port que vous essayez d'utiliser.
Pour vérifier si un port est utilisé, vous pouvez utiliser la commande netstat
. Voici un exemple de code simple qui vous permet de vérifier si un port spécifique (dans ce cas, le port 80) est utilisé :
netstat -tuln | grep :80
Dans la sortie, si vous voyez le numéro de port souhaité répertorié, cela signifie que le port est occupé. Dans les systèmes Linux, vous pouvez également utiliser la commande lsof
pour savoir quels processus utilisent un certain port :
sudo lsof -i :80
Une fois que vous avez identifié le processus, vous pouvez le terminer à l'aide de la commande kill
:
kill -9 PID
Remplacez PID
par l'ID du processus que vous avez obtenu à partir de la commande précédente.
Si vous êtes certain qu'aucun autre processus n'utilise le port et que vous rencontrez toujours l'erreur, cela peut être dû à un problème de paramètres réseau de votre système d'exploitation. Dans ce cas, envisagez de demander de l'aide à un professionnel de l'informatique ou à la communauté Streamlit.
Partie 6 : Maintenir les applications Streamlit à jour
Un autre défi auquel vous pourriez être confronté est de vous assurer que votre application Streamlit affiche toujours des données à jour. Cela est particulièrement important si votre application affiche des données en direct ou fréquemment mises à jour. La solution à ce défi réside dans le cache de Streamlit.
Le mécanisme de cache de Streamlit permet à votre application de stocker des données en mémoire, de sorte qu'elles n'aient pas besoin d'être chargées à partir du disque ou récupérées à partir d'un serveur distant à chaque exécution de l'application.
En utilisant le décorateur @st.cache
dans vos fonctions de chargement de données, vous pouvez améliorer considérablement la vitesse et la réactivité de votre application. Par exemple, si vous avez une fonction qui récupère des données à partir d'un serveur distant, vous pouvez ajouter le décorateur @st.cache
au-dessus de la fonction comme ceci :
@st.cache
def get_data():
# récupérer les données depuis le serveur distant
return données
Ainsi, Streamlit stockera les données renvoyées dans son cache. Lorsque la fonction est appelée à nouveau, Streamlit vérifiera d'abord si les données se trouvent dans son cache. Si c'est le cas, Streamlit utilisera les données mises en cache plutôt que d'appeler à nouveau la fonction.
De plus, Streamlit propose le paramètre ttl
que vous pouvez utiliser pour spécifier la durée pendant laquelle les données doivent être mises en cache. Si vous définissez ttl
sur un certain nombre de secondes, Streamlit rafraîchira automatiquement les données mises en cache après cette durée.
Voici un exemple de l'utilisation du paramètre ttl
dans votre fonction :
@st.cache(ttl=60*60*2)
def get_data():
# récupérer les données depuis le serveur distant
return données
Dans cet exemple, le ttl
est fixé à deux heures (60 secondes * 60 minutes * 2), ce qui signifie que Streamlit rafraîchira automatiquement les données toutes les deux heures.
Conclusion
Exécuter des applications Streamlit sur le port 80 n'est pas aussi simple qu'il n'y paraît, en raison de la nature privilégiée du port et d'autres problèmes potentiels tels que les ports occupés ou les autorisations. Mais avec les connaissances que nous avons discutées dans ce guide, vous devriez être bien préparé pour faire face à ces défis.
N'oubliez pas, lorsque vous rencontrez des difficultés, n'hésitez pas à consulter la communauté Streamlit. Elle est composée de personnes compétentes qui ont probablement rencontré des problèmes similaires et sont plus qu'heureuses de vous aider.
Questions fréquemment posées
1. Pourquoi ne puis-je pas exécuter mon application Streamlit sur le port 80 ?
Les ports inférieurs à 1024, y compris le port 80, sont considérés comme privilégiés dans les systèmes d'exploitation de type Unix et nécessitent généralement un accès superutilisateur (ou root). Assurez-vous d'avoir les permissions nécessaires et que le port n'est pas déjà utilisé.
2. Comment puis-je exécuter plusieurs applications Streamlit simultanément ?
Vous pouvez exécuter plusieurs applications Streamlit en spécifiant des numéros de port différents pour chaque application en utilisant le paramètre --server.port
lors du démarrage de l'application.
3. Comment puis-je maintenir mes données d'application Streamlit à jour ?
Vous pouvez utiliser le décorateur @st.cache
dans vos fonctions de chargement de données pour stocker les données en mémoire, ce qui améliore la vitesse et la réactivité de votre application. Streamlit propose également le paramètre ttl
pour spécifier la durée pendant laquelle les données doivent être mises en cache.