
แพ็คเกจ Hydralit เป็นโครงการห่อและเทมเพลตเพื่อรวมแอปพลิเคชัน Streamlit ที่เป็นอิสระหลายอย่าง (หรือขึ้นอยู่กับ) เข้ากับแอปพลิเคชันหลายหน้า
ขณะนี้โครงการใช้แอปพลิเคชันโฮสต์ Hydraapp และแอปพลิเคชันเด็กแต่ละคนจำเป็นต้องเป็นคลาสที่ได้จากคลาส Hydraheadapp และใช้วิธีเดียวที่เรียบง่าย Run () เพื่อผลกำไรสูงสุดหรือคุณสามารถใช้ตกแต่งสไตล์ขวดในการทำงานของคุณ
เมื่อแปลงแอพพลิเคชั่นที่มีอยู่คุณสามารถใส่รหัสที่มีอยู่ทั้งหมดได้อย่างมีประสิทธิภาพภายในวิธีการเรียกใช้ () และสร้างคลาส wrapper ที่ได้มาจาก HydraheadApp หรือวางมัณฑนากรที่ทำงาน จากนั้นคุณสร้างแอปพาเรนต์เป็นอินสแตนซ์ของ Hydraapp ให้เพิ่มแอพลูกของคุณลงไป (ดูตัวอย่าง 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
เนื่องจากโมเดลการดำเนินการของ Streamlit ความสามารถในการใช้ลิงก์ NAV ภายในจากแอพเด็กเป็นหนึ่งนัดเมื่อใช้ Navbar ซึ่งหมายความว่าลิงค์ภายในจะเปลี่ยนเส้นทางไปยังเด็กอย่างไรก็ตามหากมีการร้องขอสคริปต์ซ้ำในแอพลูก (เปลี่ยนค่าของวิดเจ็ตเป็นต้น) NAV จะย้อนกลับไปที่แอปโทร คุณสามารถปิดการใช้งานเมนู Navbar และเมนูหลักของ Streamlit Core จะปรากฏขึ้นและลิงก์ภายในจะทำงานตามที่คาดไว้
app = HydraApp ( title = 'Secure Hydralit Data Explorer' , favicon = "?" , hide_streamlit_markers = True , use_navbar = True , navbar_sticky = True )Hydralit Navbar มีการรวมเข้ากับธีมและภาพเคลื่อนไหวอย่างสมบูรณ์ (คุณสามารถปิดได้หากคุณต้องการ) เพียงเพิ่มแอพบุตรหลานของคุณและไป Navbar จะปรากฏขึ้นโดยอัตโนมัติ
ออกจากกล่องคุณจะได้รับตัวโหลด/สปินเนอร์ที่ดีเมื่อนำทางระหว่างแอพ/หน้า นอกจากนี้คุณยังสามารถสร้างแอพโหลดเดอร์ของคุณเองและปรับแต่งทุกส่วนของรูปลักษณ์และเมื่อโหลดได้อย่างสมบูรณ์แม้กระทั่งการสร้างเอฟเฟกต์ที่แตกต่างกันขึ้นอยู่กับแอปพลิเคชันเป้าหมาย ดูรหัสตัวอย่างที่ปลอดภัยของ 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 ( 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_example > pip install -r requirements.txt
hydralit_example > streamlit run secure.appตัวอย่างรหัสนี้มาโดยตรงจากตัวอย่างข้อมูล Streamlit Data Explorer
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 และวางรหัสทั้งหมดในวิธีการเรียกใช้ ()
สำหรับแอปพลิเคชันการสาธิต Streamlit ข้างต้นซึ่งหมายความว่าสิ่งที่จำเป็นทั้งหมดคือการปรับเปลี่ยนเล็กน้อยเราสร้างไฟล์ 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 จาก Hydralit และวางรหัสทั้งหมดในวิธีการเรียกใช้ () เราสร้างไฟล์ 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รหัสสำหรับแอปพลิเคชันโฮสต์ที่มีความปลอดภัยด้วยแอพเข้าสู่ระบบแสดงอยู่ด้านล่างตัวอย่างทั้งหมดอยู่ในที่เก็บตัวอย่างตัวอย่าง
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_example > pip install -r requirements.txt
hydralit_example > streamlit run secure.app