
حزمة Hydralit عبارة عن مشروع ملفوف وقالب يجمع بين العديد من التطبيقات البطيئة المستقلة (أو المعتمدة إلى حد ما) في تطبيق متعدد الصفحات.
يقوم المشروع حاليًا بتطبيق تطبيق مضيف HydraApp ، ويجب أن يكون كل تطبيق طفل ببساطة فئة مستمدة من فئة HydraHeadApp وتنفيذ طريقة واحدة بسيطة ، أو تشغيل () لتحقيق أقصى قدر من الربح ، أو يمكنك استخدام زخرفة نمط القارورة على وظائفك لإضافتها مباشرة كصفحات تدفق منفصلة.
عند تحويل التطبيقات الحالية ، يمكنك وضع جميع الكود الموجود داخل طريقة Run () بفعالية وإنشاء فئة غلاف مستمدة من HydraheadApp أو وضع ديكور على الوظيفة. ثم تقوم بإنشاء تطبيق الأصل كمثيل لـ HydraApp ، وإضافة تطبيقات طفلك إليه (انظر Example Secure_app.py) ومع وجود عدد قليل من أسطر الكود ، سيجتمع كل شيء بطريقة سحرية.
يمكن تثبيت Hydralit من Pypi:
pip install -U hydralit #when we import hydralit, we automatically get all of Streamlit
import hydralit as hy
app = hy . HydraApp ( title = 'Simple Multi-Page App' )
@ app . addapp ()
def my_home ():
hy . info ( 'Hello from app1' )
@ app . addapp ()
def app2 ():
hy . info ( 'Hello from app 2' )
#Run the whole lot, we get navbar, state management and app isolation, all with this tiny amount of work.
app . run ()تنشئ هذه الكمية الصغيرة من التعليمات البرمجية قائمة وصفحات تقدم عندما يتم استدعاء الوظيفة الهدف عن طريق تحديدها من القائمة.



<br
نظرًا لنموذج التنفيذ البطيء ، فإن القدرة على استخدام روابط NAV الداخلية من تطبيق الطفل هي طلقة واحدة عند استخدام شريط النقل. هذا يعني أن الرابط الداخلي سيعيد توجيهه إلى الطفل ، ولكن إذا تم تقديم طلب إعادة تشغيل البرنامج النصي داخل تطبيق الطفل (تغيير قيمة عنصر واجهة المستخدم على سبيل المثال) ، فسوف يرتد NAV إلى تطبيق الاتصال. يمكنك تعطيل Navbar وستظهر قائمة مكونات NAV Core Spreamlit وستعمل الروابط الداخلية كما هو متوقع.
app = HydraApp ( title = 'Secure Hydralit Data Explorer' , favicon = "?" , hide_streamlit_markers = True , use_navbar = True , navbar_sticky = True )تم دمج Navbar المائي بالكامل ، ويدرك السمة والرسوم المتحركة (يمكنك إيقاف تشغيله إذا أردت) ، فقط أضف تطبيقات طفلك و GO ، سيظهر Navbar تلقائيًا.
خارج الصندوق ، تحصل على محمل/دوار لطيف عند التنقل بين التطبيقات/الصفحات. يمكنك أيضًا إنشاء تطبيق Loader الخاص بك وتخصيص كل جزء من كيفية ظهوره تمامًا وعندما يتم تحميله ، حتى إنشاء تأثيرات مختلفة اعتمادًا على التطبيق المستهدف. راجع رمز مثال Hydralit Secure لمعرفة ما هو ممكن.



إذا كان لديك بعض الوظائف وتريدها أن تعمل مثل الصفحات المنفصلة ، فيمكنك الذهاب بسرعة مع ديكور على نمط القارورة على وظائفك.
#when we import hydralit, we automatically get all of Streamlit
import hydralit as hy
app = hy . HydraApp ( title = 'Simple Multi-Page App' )
@ app . addapp ( is_home = True )
def my_home ():
hy . info ( 'Hello from Home!' )
@ app . addapp ()
def app2 ():
hy . info ( 'Hello from app 2' )
@ app . addapp ( title = 'The Best' , icon = "?" )
def app3 ():
hy . info ( 'Hello from app 3, A.K.A, The Best ?' )
#Run the whole lot, we get navbar, state management and app isolation, all with this tiny amount of work.
app . run ()تنشئ هذه الكمية الصغيرة من التعليمات البرمجية تطبيقًا مخصصًا متعدد الصفحات على النحو التالي.

يمكنك تجربتها من خلال تشغيل تطبيقين عينة مع أطفالهم الموجودين في مستودع مثال Hydralit.
hydralit_example > pip install -r requirements.txt
hydralit_example > streamlit run secure.appعينة الرمز هذه تأتي مباشرة من مستكشف بيانات مثال على سبيل المثال
import streamlit as st
import pandas as pd
import numpy as np
st . title ( 'Uber pickups in NYC' )
DATE_COLUMN = 'date/time'
DATA_URL = ( 'https://s3-us-west-2.amazonaws.com/'
'streamlit-demo-data/uber-raw-data-sep14.csv.gz' )
@ st . cache
def load_data ( nrows ):
data = pd . read_csv ( DATA_URL , nrows = nrows )
lowercase = lambda x : str ( x ). lower ()
data . rename ( lowercase , axis = 'columns' , inplace = True )
data [ DATE_COLUMN ] = pd . to_datetime ( data [ DATE_COLUMN ])
return data
data_load_state = st . text ( 'Loading data...' )
data = load_data ( 10000 )
data_load_state . text ( "Done! (using st.cache)" )
if st . checkbox ( 'Show raw data' ):
st . subheader ( 'Raw data' )
st . write ( data )
st . subheader ( 'Number of pickups by hour' )
hist_values = np . histogram ( data [ DATE_COLUMN ]. dt . hour , bins = 24 , range = ( 0 , 24 ))[ 0 ]
st . bar_chart ( hist_values )
# Some number in the range 0-23
hour_to_filter = st . slider ( 'hour' , 0 , 23 , 17 )
filtered_data = data [ data [ DATE_COLUMN ]. dt . hour == hour_to_filter ]
st . subheader ( 'Map of all pickups at %s:00' % hour_to_filter )
st . map ( filtered_data )دعنا نستخدم أيضًا تطبيقًا بسيطًا للجمع بين العرض التوضيحي أعلاه.
import streamlit as st
import numpy as np
import pandas as pd
from data . create_data import create_table
def app ():
st . title ( 'Small Application with a table and chart.' )
st . write ( "See `apps/simple.py` to know how to use it." )
st . markdown ( "### Plot" )
df = create_table ()
st . line_chart ( df )يمكنك بسهولة تحويل هذه التطبيقات لاستخدامها داخل HydRalit ببساطة عن طريق التفاف كل فئة مشتقة من HydraheadApp داخل HydRalit ووضع جميع الكود في طريقة Run ().
بالنسبة للتطبيق التجريبي المذكور أعلاه ، هذا يعني أن كل ما هو مطلوب هو تعديل بسيط ، نقوم بإنشاء ملف sample_app.py ونضيف ؛
import streamlit as st
import pandas as pd
import numpy as np
#add an import to Hydralit
from hydralit import HydraHeadApp
#create a wrapper class
class MySampleApp ( HydraHeadApp ):
#wrap all your code in this method and you should be done
def run ( self ):
#-------------------existing untouched code------------------------------------------
st . title ( 'Uber pickups in NYC' )
DATE_COLUMN = 'date/time'
DATA_URL = ( 'https://s3-us-west-2.amazonaws.com/'
'streamlit-demo-data/uber-raw-data-sep14.csv.gz' )
@ st . cache
def load_data ( nrows ):
data = pd . read_csv ( DATA_URL , nrows = nrows )
lowercase = lambda x : str ( x ). lower ()
data . rename ( lowercase , axis = 'columns' , inplace = True )
data [ DATE_COLUMN ] = pd . to_datetime ( data [ DATE_COLUMN ])
return data
data_load_state = st . text ( 'Loading data...' )
data = load_data ( 10000 )
data_load_state . text ( "Done! (using st.cache)" )
if st . checkbox ( 'Show raw data' ):
st . subheader ( 'Raw data' )
st . write ( data )
st . subheader ( 'Number of pickups by hour' )
hist_values = np . histogram ( data [ DATE_COLUMN ]. dt . hour , bins = 24 , range = ( 0 , 24 ))[ 0 ]
st . bar_chart ( hist_values )
# Some number in the range 0-23
hour_to_filter = st . slider ( 'hour' , 0 , 23 , 17 )
filtered_data = data [ data [ DATE_COLUMN ]. dt . hour == hour_to_filter ]
st . subheader ( 'Map of all pickups at %s:00' % hour_to_filter )
st . map ( filtered_data )
#-------------------existing untouched code------------------------------------------بالنسبة للتطبيق الصغير الآخر ، يمكننا مرة أخرى تحويل هذا بسهولة من خلال التفاف في فئة مستمدة من HydraheadApp من Hydraalit ووضع جميع الكود في طريقة Run () ، نقوم بإنشاء ملف small_app.py ونضيف ؛
import streamlit as st
import numpy as np
import pandas as pd
from data . create_data import create_table
#add an import to Hydralit
from hydralit import HydraHeadApp
#create a wrapper class
class MySmallApp ( HydraHeadApp ):
#wrap all your code in this method and you should be done
def run ( self ):
#-------------------existing untouched code------------------------------------------
st . title ( 'Small Application with a table and chart.' )
st . markdown ( "### Plot" )
df = create_table ()
st . line_chart ( df )هذه هي الآن جاهزة لاستخدامها في تطبيق HydRalit. نحتاج فقط إلى إنشاء تطبيق مضيف بسيط يستمد من فئة Hydraapp في Hydralit ، وإضافة الأطفال ونحن انتهينا! نقوم بإنشاء ملف host_app.py ونضيف ؛
from hydralit import HydraApp
import streamlit as st
from sample_app import MySampleApp
from small_app import MySmallApp
if __name__ == '__main__' :
#this is the host application, we add children to it and that's it!
app = HydraApp ( title = 'Sample Hydralit App' , favicon = "?" )
#add all your application classes here
app . add_app ( "Small App" , icon = "?" , app = MySmallApp ())
app . add_app ( "Sample App" , icon = "?" , app = MySampleApp ())
#run the whole lot
app . run ()هذا المثال البسيط الفائق مصنوع من 3 ملفات.
hydralit sample project
│ host_app.py
│ small_app.py
│ sample_app.py
hydralit sample project > pip install hydralit
hydralit sample project > streamlit run host.appيتم عرض رمز التطبيق المضيف الذي يتم تأمينه بتطبيق تسجيل الدخول أدناه ، ويقع المثال بأكمله في مستودع مثال Hydralit-Example.
from hydralit import HydraApp
import streamlit as st
import apps
if __name__ == '__main__' :
over_theme = { 'txc_inactive' : '#FFFFFF' }
#this is the host application, we add children to it and that's it!
app = HydraApp (
title = 'Secure Hydralit Data Explorer' ,
favicon = "?" ,
hide_streamlit_markers = False ,
#add a nice banner, this banner has been defined as 5 sections with spacing defined by the banner_spacing array below.
use_banner_images = [ "./resources/hydra.png" , None ,{ 'header' : "<h1 style='text-align:center;padding: 0px 0px;color:black;font-size:200%;'>Secure Hydralit Explorer</h1><br>" }, None , "./resources/lock.png" ],
banner_spacing = [ 5 , 30 , 60 , 30 , 5 ],
use_navbar = True ,
navbar_sticky = False ,
navbar_theme = over_theme
)
#Home button will be in the middle of the nav list now
app . add_app ( "Home" , icon = "?" , app = apps . HomeApp ( title = 'Home' ), is_home = True )
#add all your application classes here
app . add_app ( "Cheat Sheet" , icon = "" , app = apps . CheatApp ( title = "Cheat Sheet" ))
app . add_app ( "Sequency Denoising" , icon = "?" , app = apps . WalshApp ( title = "Sequency Denoising" ))
app . add_app ( "Sequency (Secure)" , icon = "?" , app = apps . WalshAppSecure ( title = "Sequency (Secure)" ))
app . add_app ( "Solar Mach" , icon = "?️" , app = apps . SolarMach ( title = "Solar Mach" ))
app . add_app ( "Spacy NLP" , icon = "⌨️" , app = apps . SpacyNLP ( title = "Spacy NLP" ))
app . add_app ( "Uber Pickups" , icon = "?" , app = apps . UberNYC ( title = "Uber Pickups" ))
app . add_app ( "Solar Mach" , icon = "?️" , app = apps . SolarMach ( title = "Solar Mach" ))
#we have added a sign-up app to demonstrate the ability to run an unsecure app
#only 1 unsecure app is allowed
app . add_app ( "Signup" , icon = "?️" , app = apps . SignUpApp ( title = 'Signup' ), is_unsecure = True )
#we want to have secure access for this HydraApp, so we provide a login application
#optional logout label, can be blank for something nicer!
app . add_app ( "Login" , apps . LoginApp ( title = 'Login' ), is_login = True )
#specify a custom loading app for a custom transition between apps, this includes a nice custom spinner
app . add_loader_app ( apps . MyLoadingApp ( delay = 5 ))
#app.add_loader_app(apps.QuickLoaderApp())
#we can inject a method to be called everytime a user logs out
@ app . logout_callback
def mylogout_cb ():
print ( 'I was called from Hydralit at logout!' )
#we can inject a method to be called everytime a user logs in
@ app . login_callback
def mylogin_cb ():
print ( 'I was called from Hydralit at login!' )
#if we want to auto login a guest but still have a secure app, we can assign a guest account and go straight in
app . enable_guest_access ()
#--------------------------------------------------------------------------------------------------------------------
#if the menu is looking shit, use some sections
#check user access level to determine what should be shown on the menu
user_access_level , username = app . check_access ()
# If the menu is cluttered, just rearrange it into sections!
# completely optional, but if you have too many entries, you can make it nicer by using accordian menus
if user_access_level > 1 :
complex_nav = {
'Home' : [ 'Home' ],
'Intro ?' : [ 'Cheat Sheet' , "Solar Mach" ],
'Hotstepper ' : [ "Sequency Denoising" , "Sequency (Secure)" ],
'Clustering' : [ "Uber Pickups" ],
'NLP' : [ "Spacy NLP" ],
}
elif user_access_level == 1 :
complex_nav = {
'Home' : [ 'Home' ],
'Intro ?' : [ 'Cheat Sheet' , "Solar Mach" ],
'Hotstepper ' : [ "Sequency Denoising" ],
'Clustering' : [ "Uber Pickups" ],
'NLP' : [ "Spacy NLP" ],
}
else :
complex_nav = {
'Home' : [ 'Home' ],
}
#and finally just the entire app and all the children.
app . run ( complex_nav )
#(DEBUG) print user movements and current login details used by Hydralit
#---------------------------------------------------------------------
user_access_level , username = app . check_access ()
prev_app , curr_app = app . get_nav_transition ()
print ( prev_app , '- >' , curr_app )
print ( int ( user_access_level ), '- >' , username )
#---------------------------------------------------------------------يمكنك تجربتها من خلال تشغيل تطبيقين عينة مع أطفالهم الموجودين في مستودع مثال Hydralit.
hydralit_example > pip install -r requirements.txt
hydralit_example > streamlit run secure.app