Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Peribadikan untuk setiap pengguna dengan Streamlit in Snowflake (SiS)

Peribadikan untuk setiap pengguna dengan Streamlit in Snowflake (SiS)

DDD
DDDasal
2024-09-14 12:15:17467semak imbas

pengenalan

Pada penghujung Julai 2024, Current_User dan Dasar Akses Baris tersedia dalam Streamlit in Snowflake.

Bahagian menarik dalam kemas kini ini ialah kini mudah dan selamat untuk mengenal pasti pengguna Snowflake yang disambungkan ke aplikasi dan menyesuaikan pemprosesan untuk setiap pengguna.

Tanpa perlu menyediakan mekanisme log masuk tersuai atau jadual pengurusan pengguna, anda boleh memperibadikan satu aplikasi untuk setiap pengguna dengan cara seperti:

  • Menukar paparan aplikasi untuk setiap pengguna
  • Menyediakan papan pemuka analisis diperibadikan untuk setiap pengguna
  • Menggunakan dasar akses baris untuk mendapatkan hasil keluaran pertanyaan yang berbeza untuk setiap pengguna (Edisi Perusahaan dan ke atas)

Dalam siaran ini, kami akan membuat senarai Tugasan mudah yang memaparkan maklumat pengguna individu.

Nota: Catatan ini mewakili pandangan peribadi saya dan bukan pandangan Snowflake.

Gambaran Keseluruhan Ciri

Matlamat

  • Urus senarai Tugasan peribadi menggunakan apl kongsi tunggal
  • Gunakan dasar akses baris untuk menghalang Tugasan orang lain daripada dipaparkan

Imej Selesai

Personalize for each user with Streamlit in Snowflake (SiS)
Skrin pengguna TKANNO

Personalize for each user with Streamlit in Snowflake (SiS)
Skrin TARO pengguna

Prasyarat

  • Akaun Snowflake
    • Akaun Edisi Perusahaan diperlukan untuk menggunakan dasar akses baris

Nota

  • Streamlit dalam Snowflake berjalan dengan keistimewaan pemilik, jadi Current_Role akan sama dengan peranan aplikasi Streamlit in Snowflake. (Oleh itu, ia tidak boleh digunakan untuk pemperibadian)

Prosedur

Buat jadual untuk menyimpan senarai Tugasan

Laksanakan arahan berikut daripada lembaran kerja:

-- Create ToDo list table
CREATE TABLE IF NOT EXISTS todo_list (
    id INT AUTOINCREMENT,
    task VARCHAR(255),
    status VARCHAR(20),
    due_date DATE,
    completed_date DATE,
    owner VARCHAR(50)
);

Buat dasar akses baris

Dasar ini mengembalikan baris yang pemilik dalam jadual todo_list sepadan dengan current_user yang disambungkan ke aplikasi Streamlit in Snowflake.

Laksanakan arahan berikut daripada lembaran kerja:

-- Create row access policy
CREATE ROW ACCESS POLICY IF NOT EXISTS todo_row_access_policy
    AS (owner VARCHAR) RETURNS BOOLEAN ->
        owner = CURRENT_USER();

Gunakan dasar akses baris

Laksanakan arahan berikut daripada lembaran kerja:

-- Apply row access policy
ALTER TABLE todo_list ADD ROW ACCESS POLICY todo_row_access_policy ON (owner);

Ini melengkapkan operasi lembaran kerja.

Jalankan apl Streamlit dalam Snowflake

Buat Streamlit baharu dalam apl Snowflake dan salin & tampal kod berikut:

Barisan 14 ialah tempat pengguna semasa yang disambungkan ke apl itu diambil sebagai rentetan.

import streamlit as st
from snowflake.snowpark.context import get_active_session
import pandas as pd

# Layout settings
st.set_page_config(
    layout="wide"
)

# Get Snowflake session
session = get_active_session()

# Get current user
current_user = session.sql("SELECT CURRENT_USER()").collect()[0][0]

# Get ToDo list
def get_todo_list():
    return session.table("todo_list").to_pandas()

# Add or update task
def upsert_task(task_id, task, status, due_date, completed_date):
    due_date_sql = f"'{due_date}'" if due_date else "NULL"
    completed_date_sql = f"'{completed_date}'" if completed_date else "NULL"

    if task_id:
        session.sql(f"""
        UPDATE todo_list
        SET task = '{task}', status = '{status}', due_date = {due_date_sql}, completed_date = {completed_date_sql}
        WHERE id = {task_id}
        """).collect()
    else:
        session.sql(f"""
        INSERT INTO todo_list (task, status, owner, due_date, completed_date)
        VALUES ('{task}', '{status}', '{current_user}', {due_date_sql}, {completed_date_sql})
        """).collect()

# Delete task
def delete_task(task_id):
    session.sql(f"DELETE FROM todo_list WHERE id = {task_id}").collect()

# Main function
def main():
    st.title(f"{current_user}'s Personal Dashboard")

    # Task list
    st.subheader(f"{current_user}'s ToDo List")
    todo_df = get_todo_list()

    # Display header
    col1, col2, col3, col4, col5 = st.columns([3, 2, 2, 2, 2])
    col1.write("Task")
    col2.write("Status")
    col3.write("Due Date")
    col4.write("Completed Date")
    col5.write("Delete")

    # Display task list
    for _, row in todo_df.iterrows():
        col1, col2, col3, col4, col5 = st.columns([3, 2, 2, 2, 2])

        with col1:
            task = st.text_input("task", value=row['TASK'], key=f"task_{row['ID']}", label_visibility="collapsed")

        with col2:
            status = st.selectbox("status", ["Pending", "In Progress", "Completed"], index=["Pending", "In Progress", "Completed"].index(row['STATUS']), key=f"status_{row['ID']}", label_visibility="collapsed")

        with col3:
            due_date = st.date_input("due_date", value=pd.to_datetime(row['DUE_DATE']).date() if pd.notna(row['DUE_DATE']) else None, key=f"due_date_{row['ID']}", label_visibility="collapsed")

        with col4:
            completed_date = st.date_input("comp_date", value=pd.to_datetime(row['COMPLETED_DATE']).date() if pd.notna(row['COMPLETED_DATE']) else None, key=f"completed_date_{row['ID']}", label_visibility="collapsed")

        with col5:
            if st.button("Delete", key=f"delete_{row['ID']}"):
                delete_task(row['ID'])
                st.experimental_rerun()

        # Update database immediately if values change
        if task != row['TASK'] or status != row['STATUS'] or due_date != row['DUE_DATE'] or completed_date != row['COMPLETED_DATE']:
            upsert_task(row['ID'], task, status, due_date, completed_date)
            st.experimental_rerun()

    # Add new task
    st.subheader("Add New Task")
    new_task = st.text_input("New Task")
    new_status = st.selectbox("Status", ["Pending", "In Progress", "Completed"])
    new_due_date = st.date_input("Due Date")
    if st.button("Add"):
        upsert_task(None, new_task, new_status, new_due_date, None)
        st.success("New task added")
        st.experimental_rerun()

# Main process
if __name__ == "__main__":
    main()

Kesimpulan

Apa pendapat anda? Dengan menggabungkan Current_User dan dasar akses baris, anda boleh membuat aplikasi selamat yang diperibadikan untuk setiap pengguna dengan langkah mudah. Ini membuka kemungkinan untuk mencipta aplikasi yang lebih mesra pengguna berdasarkan idea anda.

Sesetengah idea lanjutan termasuk menambah maklumat Current_User sebagai tandatangan semasa menulis pada jadual melalui Streamlit in Snowflake, atau menggunakan maklumat diperibadikan sebagai konteks untuk Cortex LLM untuk mencipta pembantu peribadi.

Sila cuba mencabar diri anda dengan penggunaan Current_User yang menarik!

Pengumuman

Kepingan Salji Apakah Kemas Kini Baharu pada X

Saya berkongsi kemas kini Snowflake's What's New pada X. Sila ikuti jika anda berminat!

Versi Bahasa Inggeris

Snowflake What's New Bot (Versi Bahasa Inggeris)
https://x.com/snow_new_en

Versi Jepun

Snowflake What's New Bot (Versi Jepun)
https://x.com/snow_new_jp

Sejarah Perubahan

(20240914) Catatan awal

Artikel Asal Jepun

https://zenn.dev/tsubasa_tech/articles/a23029dfe97c46

Atas ialah kandungan terperinci Peribadikan untuk setiap pengguna dengan Streamlit in Snowflake (SiS). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn