streamlit-nightly 1.41.2.dev20241227__py2.py3-none-any.whl → 1.41.2.dev20250124__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- streamlit/__init__.py +11 -2
- streamlit/__main__.py +1 -1
- streamlit/auth_util.py +209 -0
- streamlit/cli_util.py +1 -1
- streamlit/column_config.py +1 -1
- streamlit/commands/__init__.py +1 -1
- streamlit/commands/echo.py +1 -1
- streamlit/commands/execution_control.py +1 -1
- streamlit/commands/experimental_query_params.py +1 -1
- streamlit/commands/logo.py +1 -1
- streamlit/commands/navigation.py +16 -15
- streamlit/commands/page_config.py +1 -1
- streamlit/components/__init__.py +1 -1
- streamlit/components/lib/__init__.py +1 -1
- streamlit/components/lib/local_component_registry.py +1 -1
- streamlit/components/types/__init__.py +1 -1
- streamlit/components/types/base_component_registry.py +1 -1
- streamlit/components/types/base_custom_component.py +1 -1
- streamlit/components/v1/__init__.py +1 -1
- streamlit/components/v1/component_arrow.py +1 -1
- streamlit/components/v1/component_registry.py +1 -1
- streamlit/components/v1/components.py +1 -1
- streamlit/components/v1/custom_component.py +1 -1
- streamlit/config.py +18 -3
- streamlit/config_option.py +10 -19
- streamlit/config_util.py +1 -1
- streamlit/connections/__init__.py +1 -1
- streamlit/connections/base_connection.py +1 -1
- streamlit/connections/snowflake_connection.py +31 -50
- streamlit/connections/snowpark_connection.py +1 -1
- streamlit/connections/sql_connection.py +1 -1
- streamlit/connections/util.py +1 -1
- streamlit/cursor.py +1 -1
- streamlit/dataframe_util.py +3 -3
- streamlit/delta_generator.py +7 -3
- streamlit/delta_generator_singletons.py +1 -1
- streamlit/deprecation_util.py +1 -1
- streamlit/development.py +1 -1
- streamlit/elements/__init__.py +1 -1
- streamlit/elements/alert.py +1 -1
- streamlit/elements/arrow.py +25 -3
- streamlit/elements/balloons.py +1 -1
- streamlit/elements/bokeh_chart.py +1 -1
- streamlit/elements/code.py +9 -1
- streamlit/elements/deck_gl_json_chart.py +1 -1
- streamlit/elements/dialog_decorator.py +1 -1
- streamlit/elements/doc_string.py +1 -1
- streamlit/elements/empty.py +1 -1
- streamlit/elements/exception.py +8 -10
- streamlit/elements/form.py +1 -1
- streamlit/elements/graphviz_chart.py +1 -1
- streamlit/elements/heading.py +1 -1
- streamlit/elements/html.py +1 -1
- streamlit/elements/iframe.py +1 -1
- streamlit/elements/image.py +1 -1
- streamlit/elements/json.py +1 -1
- streamlit/elements/layouts.py +1 -1
- streamlit/elements/lib/__init__.py +1 -1
- streamlit/elements/lib/built_in_chart_utils.py +1 -1
- streamlit/elements/lib/color_util.py +1 -1
- streamlit/elements/lib/column_config_utils.py +1 -1
- streamlit/elements/lib/column_types.py +1 -1
- streamlit/elements/lib/dialog.py +1 -1
- streamlit/elements/lib/dicttools.py +1 -1
- streamlit/elements/lib/event_utils.py +1 -1
- streamlit/elements/lib/file_uploader_utils.py +1 -1
- streamlit/elements/lib/form_utils.py +1 -1
- streamlit/elements/lib/image_utils.py +1 -1
- streamlit/elements/lib/js_number.py +1 -1
- streamlit/elements/lib/mutable_status_container.py +1 -1
- streamlit/elements/lib/options_selector_utils.py +1 -1
- streamlit/elements/lib/pandas_styler_utils.py +1 -1
- streamlit/elements/lib/policies.py +1 -1
- streamlit/elements/lib/streamlit_plotly_theme.py +1 -1
- streamlit/elements/lib/subtitle_utils.py +1 -1
- streamlit/elements/lib/utils.py +1 -1
- streamlit/elements/map.py +1 -1
- streamlit/elements/markdown.py +3 -3
- streamlit/elements/media.py +1 -1
- streamlit/elements/metric.py +1 -1
- streamlit/elements/plotly_chart.py +1 -1
- streamlit/elements/progress.py +1 -1
- streamlit/elements/pyplot.py +1 -1
- streamlit/elements/snow.py +1 -1
- streamlit/elements/spinner.py +14 -7
- streamlit/elements/text.py +1 -1
- streamlit/elements/toast.py +1 -1
- streamlit/elements/vega_charts.py +20 -6
- streamlit/elements/widgets/__init__.py +1 -1
- streamlit/elements/widgets/audio_input.py +1 -1
- streamlit/elements/widgets/button.py +9 -8
- streamlit/elements/widgets/button_group.py +6 -4
- streamlit/elements/widgets/camera_input.py +1 -1
- streamlit/elements/widgets/chat.py +1 -1
- streamlit/elements/widgets/checkbox.py +1 -1
- streamlit/elements/widgets/color_picker.py +1 -1
- streamlit/elements/widgets/data_editor.py +6 -5
- streamlit/elements/widgets/file_uploader.py +1 -1
- streamlit/elements/widgets/multiselect.py +1 -1
- streamlit/elements/widgets/number_input.py +1 -1
- streamlit/elements/widgets/radio.py +1 -1
- streamlit/elements/widgets/select_slider.py +1 -1
- streamlit/elements/widgets/selectbox.py +1 -1
- streamlit/elements/widgets/slider.py +1 -1
- streamlit/elements/widgets/text_widgets.py +1 -1
- streamlit/elements/widgets/time_widgets.py +63 -3
- streamlit/elements/write.py +2 -2
- streamlit/emojis.py +2 -2
- streamlit/env_util.py +1 -1
- streamlit/error_util.py +9 -3
- streamlit/errors.py +5 -1
- streamlit/external/__init__.py +1 -1
- streamlit/external/langchain/__init__.py +1 -1
- streamlit/external/langchain/streamlit_callback_handler.py +1 -1
- streamlit/file_util.py +1 -1
- streamlit/git_util.py +1 -1
- streamlit/hello/__init__.py +1 -1
- streamlit/hello/animation_demo.py +1 -1
- streamlit/hello/dataframe_demo.py +1 -1
- streamlit/hello/hello.py +1 -1
- streamlit/hello/mapping_demo.py +1 -1
- streamlit/hello/plotting_demo.py +1 -1
- streamlit/hello/streamlit_app.py +1 -1
- streamlit/hello/utils.py +1 -1
- streamlit/logger.py +1 -1
- streamlit/material_icon_names.py +2 -2
- streamlit/navigation/__init__.py +1 -1
- streamlit/navigation/page.py +7 -4
- streamlit/net_util.py +1 -1
- streamlit/platform.py +1 -1
- streamlit/proto/Alert_pb2.pyi +1 -1
- streamlit/proto/AppPage_pb2.pyi +1 -1
- streamlit/proto/ArrowNamedDataSet_pb2.pyi +1 -1
- streamlit/proto/ArrowVegaLiteChart_pb2.pyi +1 -1
- streamlit/proto/Arrow_pb2.pyi +1 -1
- streamlit/proto/AudioInput_pb2.pyi +1 -1
- streamlit/proto/Audio_pb2.pyi +1 -1
- streamlit/proto/AuthRedirect_pb2.py +27 -0
- streamlit/proto/AuthRedirect_pb2.pyi +41 -0
- streamlit/proto/AutoRerun_pb2.pyi +1 -1
- streamlit/proto/BackMsg_pb2.pyi +1 -1
- streamlit/proto/Balloons_pb2.pyi +1 -1
- streamlit/proto/Block_pb2.pyi +1 -1
- streamlit/proto/BokehChart_pb2.pyi +1 -1
- streamlit/proto/ButtonGroup_pb2.pyi +1 -1
- streamlit/proto/Button_pb2.pyi +1 -1
- streamlit/proto/CameraInput_pb2.pyi +1 -1
- streamlit/proto/ChatInput_pb2.pyi +1 -1
- streamlit/proto/Checkbox_pb2.pyi +1 -1
- streamlit/proto/ClientState_pb2.pyi +1 -1
- streamlit/proto/Code_pb2.py +2 -2
- streamlit/proto/Code_pb2.pyi +5 -2
- streamlit/proto/ColorPicker_pb2.pyi +1 -1
- streamlit/proto/Common_pb2.pyi +1 -1
- streamlit/proto/Components_pb2.pyi +1 -1
- streamlit/proto/DataFrame_pb2.pyi +1 -1
- streamlit/proto/DateInput_pb2.pyi +1 -1
- streamlit/proto/DeckGlJsonChart_pb2.pyi +1 -1
- streamlit/proto/Delta_pb2.pyi +1 -1
- streamlit/proto/DocString_pb2.pyi +1 -1
- streamlit/proto/DownloadButton_pb2.pyi +1 -1
- streamlit/proto/Element_pb2.pyi +1 -1
- streamlit/proto/Empty_pb2.pyi +1 -1
- streamlit/proto/Exception_pb2.pyi +1 -1
- streamlit/proto/Favicon_pb2.pyi +1 -1
- streamlit/proto/FileUploader_pb2.pyi +1 -1
- streamlit/proto/ForwardMsg_pb2.py +12 -9
- streamlit/proto/ForwardMsg_pb2.pyi +34 -4
- streamlit/proto/GitInfo_pb2.pyi +1 -1
- streamlit/proto/GraphVizChart_pb2.pyi +1 -1
- streamlit/proto/Heading_pb2.pyi +1 -1
- streamlit/proto/Html_pb2.pyi +1 -1
- streamlit/proto/IFrame_pb2.pyi +1 -1
- streamlit/proto/Image_pb2.pyi +1 -1
- streamlit/proto/Json_pb2.pyi +1 -1
- streamlit/proto/LabelVisibilityMessage_pb2.pyi +1 -1
- streamlit/proto/LinkButton_pb2.pyi +1 -1
- streamlit/proto/Logo_pb2.pyi +1 -1
- streamlit/proto/Markdown_pb2.pyi +1 -1
- streamlit/proto/Metric_pb2.pyi +1 -1
- streamlit/proto/MetricsEvent_pb2.pyi +1 -1
- streamlit/proto/MultiSelect_pb2.pyi +1 -1
- streamlit/proto/NamedDataSet_pb2.pyi +1 -1
- streamlit/proto/Navigation_pb2.pyi +1 -1
- streamlit/proto/NewSession_pb2.pyi +1 -1
- streamlit/proto/NumberInput_pb2.pyi +1 -1
- streamlit/proto/PageConfig_pb2.pyi +1 -1
- streamlit/proto/PageInfo_pb2.pyi +1 -1
- streamlit/proto/PageLink_pb2.pyi +1 -1
- streamlit/proto/PageNotFound_pb2.pyi +1 -1
- streamlit/proto/PageProfile_pb2.pyi +1 -1
- streamlit/proto/PagesChanged_pb2.pyi +1 -1
- streamlit/proto/ParentMessage_pb2.pyi +1 -1
- streamlit/proto/PlotlyChart_pb2.pyi +1 -1
- streamlit/proto/Progress_pb2.pyi +1 -1
- streamlit/proto/Radio_pb2.pyi +1 -1
- streamlit/proto/RootContainer_pb2.pyi +1 -1
- streamlit/proto/Selectbox_pb2.pyi +1 -1
- streamlit/proto/SessionEvent_pb2.pyi +1 -1
- streamlit/proto/SessionStatus_pb2.pyi +1 -1
- streamlit/proto/Skeleton_pb2.pyi +1 -1
- streamlit/proto/Slider_pb2.pyi +1 -1
- streamlit/proto/Snow_pb2.pyi +1 -1
- streamlit/proto/Spinner_pb2.py +2 -2
- streamlit/proto/Spinner_pb2.pyi +6 -2
- streamlit/proto/TextArea_pb2.pyi +1 -1
- streamlit/proto/TextInput_pb2.pyi +1 -1
- streamlit/proto/Text_pb2.pyi +1 -1
- streamlit/proto/TimeInput_pb2.pyi +1 -1
- streamlit/proto/Toast_pb2.pyi +1 -1
- streamlit/proto/VegaLiteChart_pb2.pyi +1 -1
- streamlit/proto/Video_pb2.pyi +1 -1
- streamlit/proto/WidgetStates_pb2.pyi +1 -1
- streamlit/proto/__init__.py +1 -1
- streamlit/runtime/__init__.py +1 -1
- streamlit/runtime/app_session.py +29 -5
- streamlit/runtime/caching/__init__.py +1 -1
- streamlit/runtime/caching/cache_data_api.py +3 -3
- streamlit/runtime/caching/cache_errors.py +1 -1
- streamlit/runtime/caching/cache_resource_api.py +1 -1
- streamlit/runtime/caching/cache_type.py +1 -1
- streamlit/runtime/caching/cache_utils.py +5 -4
- streamlit/runtime/caching/cached_message_replay.py +1 -1
- streamlit/runtime/caching/hashing.py +1 -1
- streamlit/runtime/caching/legacy_cache_api.py +1 -1
- streamlit/runtime/caching/storage/__init__.py +1 -1
- streamlit/runtime/caching/storage/cache_storage_protocol.py +1 -1
- streamlit/runtime/caching/storage/dummy_cache_storage.py +1 -1
- streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +1 -1
- streamlit/runtime/caching/storage/local_disk_cache_storage.py +5 -5
- streamlit/runtime/connection_factory.py +1 -1
- streamlit/runtime/context.py +1 -1
- streamlit/runtime/credentials.py +5 -5
- streamlit/runtime/forward_msg_cache.py +4 -2
- streamlit/runtime/forward_msg_queue.py +33 -5
- streamlit/runtime/fragment.py +2 -2
- streamlit/runtime/media_file_manager.py +1 -1
- streamlit/runtime/media_file_storage.py +1 -1
- streamlit/runtime/memory_media_file_storage.py +1 -1
- streamlit/runtime/memory_session_storage.py +1 -1
- streamlit/runtime/memory_uploaded_file_manager.py +1 -1
- streamlit/runtime/metrics_util.py +2 -1
- streamlit/runtime/pages_manager.py +4 -2
- streamlit/runtime/runtime.py +22 -6
- streamlit/runtime/runtime_util.py +1 -1
- streamlit/runtime/script_data.py +1 -1
- streamlit/runtime/scriptrunner/__init__.py +1 -1
- streamlit/runtime/scriptrunner/exec_code.py +34 -1
- streamlit/runtime/scriptrunner/magic.py +1 -1
- streamlit/runtime/scriptrunner/magic_funcs.py +1 -1
- streamlit/runtime/scriptrunner/script_cache.py +1 -1
- streamlit/runtime/scriptrunner/script_runner.py +23 -12
- streamlit/runtime/scriptrunner_utils/__init__.py +1 -1
- streamlit/runtime/scriptrunner_utils/exceptions.py +1 -1
- streamlit/runtime/scriptrunner_utils/script_requests.py +2 -1
- streamlit/runtime/scriptrunner_utils/script_run_context.py +2 -2
- streamlit/runtime/secrets.py +1 -1
- streamlit/runtime/session_manager.py +2 -2
- streamlit/runtime/state/__init__.py +1 -1
- streamlit/runtime/state/common.py +1 -1
- streamlit/runtime/state/query_params.py +2 -2
- streamlit/runtime/state/query_params_proxy.py +15 -5
- streamlit/runtime/state/safe_session_state.py +1 -1
- streamlit/runtime/state/session_state.py +1 -1
- streamlit/runtime/state/session_state_proxy.py +1 -1
- streamlit/runtime/state/widgets.py +1 -1
- streamlit/runtime/stats.py +1 -1
- streamlit/runtime/uploaded_file_manager.py +1 -1
- streamlit/runtime/websocket_session_manager.py +2 -2
- streamlit/source_util.py +1 -1
- streamlit/static/index.html +3 -3
- streamlit/static/static/css/index.mUTQuMqR.css +1 -0
- streamlit/static/static/js/{FileDownload.esm.WslOojMp.js → FileDownload.esm.C1QvS8Zm.js} +1 -1
- streamlit/static/static/js/{FormClearHelper.DSgVZ-NK.js → FormClearHelper.mT4-5rFn.js} +1 -1
- streamlit/static/static/js/{Hooks.wzeYp0oD.js → Hooks.CVNEuaGG.js} +1 -1
- streamlit/static/static/js/InputInstructions.BCvAGBeC.js +1 -0
- streamlit/static/static/js/{ProgressBar.D1he2Gib.js → ProgressBar.CcQcYD9u.js} +2 -2
- streamlit/static/static/js/RenderInPortalIfExists.DHDG9PHn.js +1 -0
- streamlit/static/static/js/Toolbar.yTE_O6B7.js +1 -0
- streamlit/static/static/js/{base-input.gDrmzpbY.js → base-input.CQPY9_oN.js} +4 -4
- streamlit/static/static/js/createSuper.DE47Tkz4.js +1 -0
- streamlit/static/static/js/data-grid-overlay-editor.5JEQwfzp.js +1 -0
- streamlit/static/static/js/{downloader.B-SkHjg2.js → downloader.CX7_KkfB.js} +1 -1
- streamlit/static/static/js/{es6.DoVDVSd_.js → es6.Be2vwxoI.js} +2 -2
- streamlit/static/static/js/{iframeResizer.contentWindow.Exq_q4jU.js → iframeResizer.contentWindow.CFHofqC-.js} +1 -1
- streamlit/static/static/js/index.0OeiPvr3.js +1 -0
- streamlit/static/static/js/index.1GBg_Cdb.js +1 -0
- streamlit/static/static/js/index.4nNgvhbk.js +4 -0
- streamlit/static/static/js/index.5F9_LJ-9.js +1 -0
- streamlit/static/static/js/index.6v5ZgUAy.js +1 -0
- streamlit/static/static/js/index.8tVXPrLX.js +1 -0
- streamlit/static/static/js/index.AExANgn1.js +1 -0
- streamlit/static/static/js/index.AXOgS1NM.js +1 -0
- streamlit/static/static/js/index.B-xzXPZE.js +3 -0
- streamlit/static/static/js/index.B0pfFJGU.js +1 -0
- streamlit/static/static/js/index.BBjf7kH1.js +1 -0
- streamlit/static/static/js/index.BGICDmL0.js +201 -0
- streamlit/static/static/js/{index.rDDlhQFp.js → index.BOeLQ18h.js} +1 -1
- streamlit/static/static/js/index.BUgJRfqp.js +3 -0
- streamlit/static/static/js/index.BpeIAypN.js +1 -0
- streamlit/static/static/js/{index.BjQJsYG6.js → index.C0ZNaKGF.js} +1 -1
- streamlit/static/static/js/index.C3eR9AQ5.js +1 -0
- streamlit/static/static/js/index.CCmrDm8Z.js +2 -0
- streamlit/static/static/js/index.CHuo89tL.js +1 -0
- streamlit/static/static/js/index.Cbi_d9ak.js +197 -0
- streamlit/static/static/js/{index.CyRDf6c5.js → index.Cg7T4wJt.js} +3 -3
- streamlit/static/static/js/index.Ci3iebpl.js +1 -0
- streamlit/static/static/js/index.CjsaBedq.js +1 -0
- streamlit/static/static/js/{index.CLHVvMN0.js → index.CvqaNor_.js} +139 -128
- streamlit/static/static/js/index.D0lxtOCO.js +2 -0
- streamlit/static/static/js/index.D1AD4NsW.js +1 -0
- streamlit/static/static/js/{index.4lqQPLdu.js → index.DLjk_wlB.js} +1 -1
- streamlit/static/static/js/{index.DfwGDOWW.js → index.DNDhYAPI.js} +2 -2
- streamlit/static/static/js/index.DY6666R7.js +1 -0
- streamlit/static/static/js/{index.DaTKmBKa.js → index.Dkr_c_9x.js} +100 -100
- streamlit/static/static/js/{index.Bcz23DKe.js → index.Hhv6gSq2.js} +12 -12
- streamlit/static/static/js/{index.Bm2n8u7I.js → index.OM83ZHKg.js} +2 -2
- streamlit/static/static/js/index.SLleoa9s.js +1 -0
- streamlit/static/static/js/{index.2Rr5kbVL.js → index.XCwDes79.js} +1 -1
- streamlit/static/static/js/{index.B_RzfO7U.js → index.a6pesEXT.js} +1 -1
- streamlit/static/static/js/{index.CAkYXoVB.js → index.er3Zfn3e.js} +2 -2
- streamlit/static/static/js/{index.CZ-znj8N.js → index.mtSGfsND.js} +1 -1
- streamlit/static/static/js/{input.28wXD4uV.js → input.B07wSbwn.js} +2 -2
- streamlit/static/static/js/{memory.jbWyoc5k.js → memory.CC_p93jh.js} +1 -1
- streamlit/static/static/js/mergeWith.ivc75cD1.js +1 -0
- streamlit/static/static/js/number-overlay-editor.Db2Be6nq.js +9 -0
- streamlit/static/static/js/possibleConstructorReturn.BNprLGNF.js +1 -0
- streamlit/static/static/js/{sandbox.CfK9-cKf.js → sandbox.BlG3HhHL.js} +1 -1
- streamlit/static/static/js/{textarea.C5OZk1uL.js → textarea.Bz6Z-kmO.js} +2 -2
- streamlit/static/static/js/threshold.B8r8f5kt.js +1 -0
- streamlit/static/static/js/{timepicker.DEpQEk7W.js → timepicker.BMSb5NlP.js} +3 -3
- streamlit/static/static/js/timer.RueuYoQV.js +1 -0
- streamlit/static/static/js/toConsumableArray.uYLXBIlD.js +3 -0
- streamlit/static/static/js/uniqueId.BdisvZXg.js +1 -0
- streamlit/static/static/js/{useBasicWidgetState.C2DsWpWi.js → useBasicWidgetState.BJFGEQDL.js} +1 -1
- streamlit/static/static/js/{useOnInputChange.Bw6YkmJD.js → useOnInputChange.BmSN_ACz.js} +1 -1
- streamlit/static/static/js/value.iufjd77T.js +1 -0
- streamlit/static/static/js/withFullScreenWrapper.CbOOMX5j.js +1 -0
- streamlit/static/static/media/MaterialSymbols-Rounded.DzyB5T7Y.woff2 +0 -0
- streamlit/string_util.py +1 -1
- streamlit/temporary_directory.py +1 -1
- streamlit/testing/__init__.py +1 -1
- streamlit/testing/v1/__init__.py +1 -1
- streamlit/testing/v1/app_test.py +1 -1
- streamlit/testing/v1/element_tree.py +1 -1
- streamlit/testing/v1/local_script_runner.py +1 -1
- streamlit/testing/v1/util.py +1 -1
- streamlit/time_util.py +1 -1
- streamlit/type_util.py +2 -2
- streamlit/url_util.py +24 -1
- streamlit/user_info.py +445 -25
- streamlit/util.py +1 -1
- streamlit/version.py +1 -1
- streamlit/watcher/__init__.py +1 -1
- streamlit/watcher/event_based_path_watcher.py +1 -1
- streamlit/watcher/folder_black_list.py +1 -1
- streamlit/watcher/local_sources_watcher.py +5 -3
- streamlit/watcher/path_watcher.py +1 -1
- streamlit/watcher/polling_path_watcher.py +1 -1
- streamlit/watcher/util.py +87 -21
- streamlit/web/__init__.py +1 -1
- streamlit/web/bootstrap.py +22 -2
- streamlit/web/cache_storage_manager_config.py +1 -1
- streamlit/web/cli.py +1 -1
- streamlit/web/server/__init__.py +1 -1
- streamlit/web/server/app_static_file_handler.py +1 -1
- streamlit/web/server/authlib_tornado_integration.py +58 -0
- streamlit/web/server/browser_websocket_handler.py +73 -7
- streamlit/web/server/component_request_handler.py +1 -1
- streamlit/web/server/media_file_handler.py +1 -1
- streamlit/web/server/oauth_authlib_routes.py +176 -0
- streamlit/web/server/oidc_mixin.py +108 -0
- streamlit/web/server/routes.py +6 -4
- streamlit/web/server/server.py +41 -4
- streamlit/web/server/server_util.py +25 -1
- streamlit/web/server/stats_request_handler.py +1 -1
- streamlit/web/server/upload_file_request_handler.py +3 -2
- streamlit/web/server/websocket_headers.py +1 -1
- {streamlit_nightly-1.41.2.dev20241227.data → streamlit_nightly-1.41.2.dev20250124.data}/scripts/streamlit.cmd +1 -1
- {streamlit_nightly-1.41.2.dev20241227.dist-info → streamlit_nightly-1.41.2.dev20250124.dist-info}/METADATA +16 -4
- streamlit_nightly-1.41.2.dev20250124.dist-info/RECORD +560 -0
- {streamlit_nightly-1.41.2.dev20241227.dist-info → streamlit_nightly-1.41.2.dev20250124.dist-info}/WHEEL +1 -1
- streamlit/static/static/css/index.ZIJkhegp.css +0 -1
- streamlit/static/static/js/InputInstructions.DpTmOmkP.js +0 -1
- streamlit/static/static/js/RenderInPortalIfExists.CphMKHZ_.js +0 -1
- streamlit/static/static/js/Toolbar.YZjXpW2P.js +0 -1
- streamlit/static/static/js/_commonjs-dynamic-modules.TDtrdbi3.js +0 -1
- streamlit/static/static/js/createSuper.Cj3WfXha.js +0 -1
- streamlit/static/static/js/data-grid-overlay-editor.CXW3Vrt9.js +0 -1
- streamlit/static/static/js/getPrototypeOf.BZAK2f3t.js +0 -1
- streamlit/static/static/js/index.1auHKWgw.js +0 -3
- streamlit/static/static/js/index.2XFKVtzu.js +0 -1
- streamlit/static/static/js/index.B9O1l5Yf.js +0 -32
- streamlit/static/static/js/index.BjtDBCFh.js +0 -2
- streamlit/static/static/js/index.Bp-uIPRI.js +0 -1
- streamlit/static/static/js/index.BrGYP4fV.js +0 -1
- streamlit/static/static/js/index.BwUmNKlx.js +0 -1
- streamlit/static/static/js/index.CCVCD0op.js +0 -1
- streamlit/static/static/js/index.CP7C0jmi.js +0 -1
- streamlit/static/static/js/index.CVNaQiWI.js +0 -4
- streamlit/static/static/js/index.CX7qwffH.js +0 -1
- streamlit/static/static/js/index.CaCnIXu_.js +0 -1
- streamlit/static/static/js/index.Ck6XWYeb.js +0 -1
- streamlit/static/static/js/index.CmD2DSvp.js +0 -201
- streamlit/static/static/js/index.CnX4MRBV.js +0 -1
- streamlit/static/static/js/index.DR8k91Kp.js +0 -1
- streamlit/static/static/js/index.Dc0EFNHf.js +0 -197
- streamlit/static/static/js/index.M9USxdKN.js +0 -1
- streamlit/static/static/js/index.MCDV8ab_.js +0 -1
- streamlit/static/static/js/index.T4c5nSGV.js +0 -2
- streamlit/static/static/js/index.brVZtr01.js +0 -1
- streamlit/static/static/js/index.fm1fEqFi.js +0 -1
- streamlit/static/static/js/index.vm3Bds7I.js +0 -1
- streamlit/static/static/js/index.y_EIxzAg.js +0 -1
- streamlit/static/static/js/number-overlay-editor.D5dgP2YW.js +0 -9
- streamlit/static/static/js/slicedToArray.DVgs1NsC.js +0 -2
- streamlit/static/static/js/string.Bl9OLDCw.js +0 -1
- streamlit/static/static/js/threshold.skajmqVB.js +0 -1
- streamlit/static/static/js/timer.DwZfkapc.js +0 -1
- streamlit/static/static/js/uniqueId.OJw6SDpp.js +0 -1
- streamlit/static/static/js/withFullScreenWrapper.BjS0eA06.js +0 -1
- streamlit/static/static/media/MaterialSymbols-Rounded.MYSe4dsi.woff2 +0 -0
- streamlit/vendor/ipython/__init__.py +0 -0
- streamlit/vendor/ipython/modified_sys_path.py +0 -67
- streamlit_nightly-1.41.2.dev20241227.dist-info/RECORD +0 -556
- /streamlit/static/static/css/{index.B26BQfSF.css → index.Bmkmz40k.css} +0 -0
- /streamlit/static/static/css/{index.CG16XVnL.css → index.DzuxGC_t.css} +0 -0
- {streamlit_nightly-1.41.2.dev20241227.dist-info → streamlit_nightly-1.41.2.dev20250124.dist-info}/entry_points.txt +0 -0
- {streamlit_nightly-1.41.2.dev20241227.dist-info → streamlit_nightly-1.41.2.dev20250124.dist-info}/top_level.txt +0 -0
streamlit/temporary_directory.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
streamlit/testing/__init__.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
streamlit/testing/v1/__init__.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
streamlit/testing/v1/app_test.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
streamlit/testing/v1/util.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
streamlit/time_util.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
streamlit/type_util.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -167,7 +167,7 @@ def to_bytes(obj: BytesLike) -> bytes:
|
|
167
167
|
_SYMPY_RE: Final = re.compile(r"^sympy.*$")
|
168
168
|
|
169
169
|
|
170
|
-
def
|
170
|
+
def is_sympy_expression(obj: object) -> TypeGuard[sympy.Expr]:
|
171
171
|
"""True if input is a SymPy expression."""
|
172
172
|
if not is_type(obj, _SYMPY_RE):
|
173
173
|
return False
|
streamlit/url_util.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -97,3 +97,26 @@ def is_url(
|
|
97
97
|
except ValueError:
|
98
98
|
return False
|
99
99
|
return False
|
100
|
+
|
101
|
+
|
102
|
+
def make_url_path(base_url: str, path: str) -> str:
|
103
|
+
"""Make a URL from a base URL and a path.
|
104
|
+
|
105
|
+
Parameters
|
106
|
+
----------
|
107
|
+
base_url : str
|
108
|
+
The base URL.
|
109
|
+
path : str
|
110
|
+
The path to append to the base URL.
|
111
|
+
|
112
|
+
Returns
|
113
|
+
-------
|
114
|
+
str
|
115
|
+
The resulting URL.
|
116
|
+
"""
|
117
|
+
base_url = base_url.strip("/")
|
118
|
+
if base_url:
|
119
|
+
base_url = "/" + base_url
|
120
|
+
|
121
|
+
path = path.lstrip("/")
|
122
|
+
return f"{base_url}/{path}"
|
streamlit/user_info.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -14,62 +14,482 @@
|
|
14
14
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
|
-
from typing import
|
17
|
+
from typing import (
|
18
|
+
TYPE_CHECKING,
|
19
|
+
Final,
|
20
|
+
Iterator,
|
21
|
+
Mapping,
|
22
|
+
NoReturn,
|
23
|
+
Union,
|
24
|
+
)
|
18
25
|
|
19
|
-
from streamlit
|
26
|
+
from streamlit import config, runtime
|
27
|
+
from streamlit.auth_util import (
|
28
|
+
encode_provider_token,
|
29
|
+
get_secrets_auth_section,
|
30
|
+
is_authlib_installed,
|
31
|
+
validate_auth_credentials,
|
32
|
+
)
|
33
|
+
from streamlit.errors import StreamlitAPIException, StreamlitAuthError
|
34
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
35
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
20
36
|
from streamlit.runtime.scriptrunner_utils.script_run_context import (
|
21
37
|
get_script_run_ctx as _get_script_run_ctx,
|
22
38
|
)
|
39
|
+
from streamlit.url_util import make_url_path
|
23
40
|
|
24
41
|
if TYPE_CHECKING:
|
25
42
|
from streamlit.runtime.scriptrunner_utils.script_run_context import UserInfo
|
26
43
|
|
27
44
|
|
45
|
+
AUTH_LOGIN_ENDPOINT: Final = "/auth/login"
|
46
|
+
AUTH_LOGOUT_ENDPOINT: Final = "/auth/logout"
|
47
|
+
|
48
|
+
|
49
|
+
@gather_metrics("login")
|
50
|
+
def login(provider: str | None = None) -> None:
|
51
|
+
"""Initiate the login flow for the given provider.
|
52
|
+
|
53
|
+
This command redirects the user to an OpenID Connect (OIDC) provider. After
|
54
|
+
the user authenticates their identity, they are redirected back to the
|
55
|
+
home page of your app. Streamlit stores a cookie with the user's identity
|
56
|
+
information in the user's browser . You can access the identity information
|
57
|
+
through |st.experimental_user|_. Call ``st.logout()`` to remove the cookie
|
58
|
+
and start a new session.
|
59
|
+
|
60
|
+
You can use any OIDC provider, including Google, Microsoft, Okta, and more.
|
61
|
+
You must configure the provider through secrets management. Although OIDC
|
62
|
+
is an extension of OAuth 2.0, you can't use generic OAuth providers.
|
63
|
+
Streamlit parses the user's identity token and surfaces its attributes in
|
64
|
+
``st.experimental_user``. If the provider returns an access token, that
|
65
|
+
token is ignored. Therefore, this command will not allow your app to act on
|
66
|
+
behalf of a user in a secure system.
|
67
|
+
|
68
|
+
For all providers, there are two shared settings, ``redirect_uri`` and
|
69
|
+
``cookie_secret``, which you must specify in an ``[auth]`` dictionary
|
70
|
+
in ``secrets.toml``. Other settings must be defined as described in the
|
71
|
+
``provider`` parameter.
|
72
|
+
|
73
|
+
- ``redirect_uri`` is your app's absolute URL with the pathname
|
74
|
+
``oauth2callback``. For local development using the default port, this is
|
75
|
+
``http://localhost:8501/oauth2callback``.
|
76
|
+
- ``cookie_secret`` should be a strong, randomly generated secret.
|
77
|
+
|
78
|
+
In addition to the shared settings, the following settings are required:
|
79
|
+
|
80
|
+
- ``client_id``
|
81
|
+
- ``client_secret``
|
82
|
+
- ``server_metadata_url``
|
83
|
+
|
84
|
+
For a complete list of OIDC parameters, see `OpenID Connect Core
|
85
|
+
<https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest>`_ and
|
86
|
+
your provider's documentation. By default, Streamlit sets
|
87
|
+
``scope="openid profile email"`` and ``prompt="select_account"``. You can
|
88
|
+
change these and other OIDC parameters by passing a dictionary of settings
|
89
|
+
to ``client_kwargs``. ``state`` and ``nonce``, which are used for
|
90
|
+
security, are handled automatically and don't need to be specified. For
|
91
|
+
more information, see Example 4.
|
92
|
+
|
93
|
+
.. Important::
|
94
|
+
- You must install ``Authlib>=1.3.2`` to use this command.
|
95
|
+
- Your authentication configuration is dependent on your host location.
|
96
|
+
When you deploy your app, remember to update your ``redirect_uri``
|
97
|
+
within your app and your provider.
|
98
|
+
- All URLs declared in the settings must be absolute (i.e., begin with
|
99
|
+
``http://`` or ``https://``).
|
100
|
+
- Streamlit automatically enables CORS and XSRF protection when you
|
101
|
+
configure authentication in ``secrets.toml``. This takes precedence
|
102
|
+
over configuration options in ``config.toml``.
|
103
|
+
- If a user is logged into your app and opens a new tab in the same
|
104
|
+
browser, they will automatically be logged in to the new session with
|
105
|
+
the same account.
|
106
|
+
- If a user closes your app without logging out, the identity cookie
|
107
|
+
will expire after 30 days.
|
108
|
+
- For security reasons, authentication is not supported for embedded
|
109
|
+
apps.
|
110
|
+
|
111
|
+
.. |st.experimental_user| replace:: ``st.experimental_user``
|
112
|
+
.. _st.experimental_user: https://docs.streamlit.io/develop/api-reference/utilities/st.experimental_user
|
113
|
+
|
114
|
+
Parameters
|
115
|
+
----------
|
116
|
+
provider: str or None
|
117
|
+
The name of your provider configuration to use for login.
|
118
|
+
|
119
|
+
If ``provider`` is ``None`` (default), Streamlit will use all settings
|
120
|
+
in the ``[auth]`` dictionary within your app's ``secrets.toml`` file.
|
121
|
+
Otherwise, use an ``[auth.{provider}]`` dictionary for the named
|
122
|
+
provider, as shown in the examples that follow. When you pass a string
|
123
|
+
to ``provider``, Streamlit will use ``redirect_uri`` and
|
124
|
+
``cookie_secret``, while ignoring any other values in the ``[auth]``
|
125
|
+
dictionary.
|
126
|
+
|
127
|
+
Examples
|
128
|
+
--------
|
129
|
+
|
130
|
+
**Example 1: Use an unnamed default identity provider**
|
131
|
+
|
132
|
+
If you do not specify a name for your provider, specify all settings within
|
133
|
+
the ``[auth]`` dictionary of your ``secrets.toml`` file. The following
|
134
|
+
example configures Google as the default provider. For information about
|
135
|
+
using OIDC with Google, see `Google Identity
|
136
|
+
<https://developers.google.com/identity/openid-connect/openid-connect>`_.
|
137
|
+
|
138
|
+
``.streamlit/secrets.toml``:
|
139
|
+
|
140
|
+
>>> [auth]
|
141
|
+
>>> redirect_uri = "http://localhost:8501/oauth2callback"
|
142
|
+
>>> cookie_secret = "xxx"
|
143
|
+
>>> client_id = "xxx"
|
144
|
+
>>> client_secret = "xxx"
|
145
|
+
>>> server_metadata_url = (
|
146
|
+
... "https://accounts.google.com/.well-known/openid-configuration"
|
147
|
+
... )
|
148
|
+
|
149
|
+
Your app code:
|
150
|
+
|
151
|
+
>>> import streamlit as st
|
152
|
+
>>>
|
153
|
+
>>> if not st.experimental_user.is_logged_in:
|
154
|
+
>>> if st.button("Log in"):
|
155
|
+
>>> st.login()
|
156
|
+
>>> else:
|
157
|
+
>>> if st.button("Log out"):
|
158
|
+
>>> st.logout()
|
159
|
+
>>> st.write(f"Hello, {st.experimental_user.name}!")
|
160
|
+
|
161
|
+
**Example 2: Use a named identity provider**
|
162
|
+
|
163
|
+
If you specify a name for your provider, save the shared settings in the
|
164
|
+
``[auth]`` dictionary of your ``secrets.toml`` file, and save the other
|
165
|
+
settings in an ``[auth.{provider}]`` dictionary, where ``{provider}`` is
|
166
|
+
the name of your provider. The following example configures Microsoft as
|
167
|
+
the provider. The example uses ``provider="microsoft"``, but you can use
|
168
|
+
any name. This name is internal to Streamlit and is used to match the login
|
169
|
+
command to its configuration. For information about using OIDC with
|
170
|
+
Microsoft, see `Microsoft Entra ID
|
171
|
+
<https://learn.microsoft.com/en-us/power-pages/security/authentication/openid-settings>`_.
|
172
|
+
To configure your ``{tenant}`` value in ``server_metadata_url``, see
|
173
|
+
`Microsoft identity platform
|
174
|
+
<https://learn.microsoft.com/en-us/entra/identity-platform/v2-protocols-oidc#find-your-apps-openid-configuration-document-uri>`_.
|
175
|
+
|
176
|
+
``.streamlit/secrets.toml``:
|
177
|
+
|
178
|
+
>>> [auth]
|
179
|
+
>>> redirect_uri = "http://localhost:8501/oauth2callback"
|
180
|
+
>>> cookie_secret = "xxx"
|
181
|
+
>>>
|
182
|
+
>>> [auth.microsoft]
|
183
|
+
>>> client_id = "xxx"
|
184
|
+
>>> client_secret = "xxx"
|
185
|
+
>>> server_metadata_url = "https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration"
|
186
|
+
|
187
|
+
Your app code:
|
188
|
+
|
189
|
+
>>> import streamlit as st
|
190
|
+
>>>
|
191
|
+
>>> if not st.experimental_user.is_logged_in:
|
192
|
+
>>> st.login("microsoft")
|
193
|
+
>>> else:
|
194
|
+
>>> st.write(f"Hello, {st.experimental_user.name}!")
|
195
|
+
|
196
|
+
**Example 3: Use multiple, named providers**
|
197
|
+
|
198
|
+
If you want to give your users a choice of authentication methods,
|
199
|
+
configure multiple providers and give them each a unique name. The
|
200
|
+
following example lets users choose between Okta and Microsoft to log in.
|
201
|
+
Always check with your identity provider to understand the structure of
|
202
|
+
their identity tokens because the returned fields may differ. Remember to
|
203
|
+
set ``{tenant}`` and ``{subdomain}`` in ``server_metadata_url`` for
|
204
|
+
Microsoft and Okta, respectively.
|
205
|
+
|
206
|
+
>>> [auth]
|
207
|
+
>>> redirect_uri = "http://localhost:8501/oauth2callback"
|
208
|
+
>>> cookie_secret = "xxx"
|
209
|
+
>>>
|
210
|
+
>>> [auth.microsoft]
|
211
|
+
>>> client_id = "xxx"
|
212
|
+
>>> client_secret = "xxx"
|
213
|
+
>>> server_metadata_url = "https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration"
|
214
|
+
>>>
|
215
|
+
>>> [auth.okta]
|
216
|
+
>>> client_id = "xxx"
|
217
|
+
>>> client_secret = "xxx"
|
218
|
+
>>> server_metadata_url = (
|
219
|
+
... "https://{subdomain}.okta.com/.well-known/openid-configuration"
|
220
|
+
... )
|
221
|
+
|
222
|
+
Your app code:
|
223
|
+
|
224
|
+
>>> import streamlit as st
|
225
|
+
>>>
|
226
|
+
>>> if not st.experimental_user.is_logged_in:
|
227
|
+
>>> st.header("Log in:")
|
228
|
+
>>> if st.button("Microsoft"):
|
229
|
+
>>> st.login("microsoft")
|
230
|
+
>>> if st.button("Okta"):
|
231
|
+
>>> st.login("okta")
|
232
|
+
>>> else:
|
233
|
+
>>> if st.button("Log out"):
|
234
|
+
>>> st.logout()
|
235
|
+
>>> st.write(f"Hello, {st.experimental_user.name}!")
|
236
|
+
|
237
|
+
**Example 4: Change the default connection settings**
|
238
|
+
|
239
|
+
``prompt="select_account"`` may be treated differently by some
|
240
|
+
providers when a user is already logged into their account. If a user is
|
241
|
+
logged into their Google or Microsoft account from a previous session, the
|
242
|
+
provider will prompt them to select the account they want to use, even if
|
243
|
+
it's the only one. However, if the user is logged into their Okta or Auth0
|
244
|
+
account from a previous session, the account will automatically be
|
245
|
+
selected. ``st.logout()`` does not clear a user's related cookies. To force
|
246
|
+
users to log in every time, use ``prompt="login"`` as described in Auth0's
|
247
|
+
`Customize Signup and Login Prompts
|
248
|
+
<https://auth0.com/docs/customize/login-pages/universal-login/customize-signup-and-login-prompts>`_.
|
249
|
+
|
250
|
+
``.streamlit/secrets.toml``:
|
251
|
+
|
252
|
+
>>> [auth]
|
253
|
+
>>> redirect_uri = "http://localhost:8501/oauth2callback"
|
254
|
+
>>> cookie_secret = "xxx"
|
255
|
+
>>>
|
256
|
+
>>> [auth.auth0]
|
257
|
+
>>> client_id = "xxx"
|
258
|
+
>>> client_secret = "xxx"
|
259
|
+
>>> server_metadata_url = (
|
260
|
+
... "https://{account}.{region}.auth0.com/.well-known/openid-configuration"
|
261
|
+
... )
|
262
|
+
>>> client_kwargs = { "prompt" = "login" }
|
263
|
+
|
264
|
+
Your app code:
|
265
|
+
|
266
|
+
>>> import streamlit as st
|
267
|
+
>>> if st.button("Log in"):
|
268
|
+
>>> st.login("auth0")
|
269
|
+
>>> if st.experimental_user.is_logged_in:
|
270
|
+
>>> if st.button("Log out"):
|
271
|
+
>>> st.logout()
|
272
|
+
>>> st.write(f"Hello, {st.experimental_user.name}!)
|
273
|
+
|
274
|
+
"""
|
275
|
+
if provider is None:
|
276
|
+
provider = "default"
|
277
|
+
|
278
|
+
context = _get_script_run_ctx()
|
279
|
+
if context is not None:
|
280
|
+
if not is_authlib_installed():
|
281
|
+
raise StreamlitAuthError(
|
282
|
+
"""To use authentication features, you need to install """
|
283
|
+
"""Authlib>=1.3.2, e.g. via `pip install Authlib`."""
|
284
|
+
)
|
285
|
+
validate_auth_credentials(provider)
|
286
|
+
fwd_msg = ForwardMsg()
|
287
|
+
fwd_msg.auth_redirect.url = generate_login_redirect_url(provider)
|
288
|
+
context.enqueue(fwd_msg)
|
289
|
+
|
290
|
+
|
291
|
+
@gather_metrics("logout")
|
292
|
+
def logout() -> None:
|
293
|
+
"""Logout the current user.
|
294
|
+
|
295
|
+
This command removes the user's information from ``st.experimental_user``,
|
296
|
+
deletes their identity cookie, and redirects them back to your app's home
|
297
|
+
page. This creates a new session.
|
298
|
+
|
299
|
+
If the user has multiple sessions open in the same browser,
|
300
|
+
``st.experimental_user`` will not be cleared in any other session.
|
301
|
+
``st.experimental_user`` only reads from the identity cookie at the start
|
302
|
+
of a session. After a session is running, you must call ``st.login()`` or
|
303
|
+
``st.logout()`` within that session to update ``st.experimental_user``.
|
304
|
+
|
305
|
+
.. Note::
|
306
|
+
This does not log the user out of their underlying account from the
|
307
|
+
identity provider.
|
308
|
+
|
309
|
+
Example
|
310
|
+
-------
|
311
|
+
``.streamlit/secrets.toml``:
|
312
|
+
|
313
|
+
>>> [auth]
|
314
|
+
>>> redirect_uri = "http://localhost:8501/oauth2callback"
|
315
|
+
>>> cookie_secret = "xxx"
|
316
|
+
>>> client_id = "xxx"
|
317
|
+
>>> client_secret = "xxx"
|
318
|
+
>>> server_metadata_url = (
|
319
|
+
... "https://accounts.google.com/.well-known/openid-configuration"
|
320
|
+
... )
|
321
|
+
|
322
|
+
Your app code:
|
323
|
+
|
324
|
+
>>> import streamlit as st
|
325
|
+
>>>
|
326
|
+
>>> if not st.experimental_user.is_logged_in:
|
327
|
+
>>> if st.button("Log in"):
|
328
|
+
>>> st.login()
|
329
|
+
>>> else:
|
330
|
+
>>> if st.button("Log out"):
|
331
|
+
>>> st.logout()
|
332
|
+
>>> st.write(f"Hello, {st.experimental_user.name}!")
|
333
|
+
"""
|
334
|
+
context = _get_script_run_ctx()
|
335
|
+
if context is not None:
|
336
|
+
context.user_info.clear()
|
337
|
+
session_id = context.session_id
|
338
|
+
|
339
|
+
if runtime.exists():
|
340
|
+
instance = runtime.get_instance()
|
341
|
+
instance.clear_user_info_for_session(session_id)
|
342
|
+
|
343
|
+
base_path = config.get_option("server.baseUrlPath")
|
344
|
+
|
345
|
+
fwd_msg = ForwardMsg()
|
346
|
+
fwd_msg.auth_redirect.url = make_url_path(base_path, AUTH_LOGOUT_ENDPOINT)
|
347
|
+
context.enqueue(fwd_msg)
|
348
|
+
|
349
|
+
|
350
|
+
def generate_login_redirect_url(provider: str) -> str:
|
351
|
+
"""Generate the login redirect URL for the given provider."""
|
352
|
+
provider_token = encode_provider_token(provider)
|
353
|
+
base_path = config.get_option("server.baseUrlPath")
|
354
|
+
login_path = make_url_path(base_path, AUTH_LOGIN_ENDPOINT)
|
355
|
+
return f"{login_path}?provider={provider_token}"
|
356
|
+
|
357
|
+
|
28
358
|
def _get_user_info() -> UserInfo:
|
29
359
|
ctx = _get_script_run_ctx()
|
30
360
|
if ctx is None:
|
31
361
|
# TODO: Add appropriate warnings when ctx is missing
|
32
362
|
return {}
|
33
|
-
|
363
|
+
context_user_info = ctx.user_info.copy()
|
34
364
|
|
365
|
+
auth_section_exists = get_secrets_auth_section()
|
366
|
+
if "is_logged_in" not in context_user_info and auth_section_exists:
|
367
|
+
context_user_info["is_logged_in"] = False
|
368
|
+
return context_user_info
|
35
369
|
|
36
|
-
|
370
|
+
|
371
|
+
class UserInfoProxy(Mapping[str, Union[str, bool, None]]):
|
37
372
|
"""
|
38
|
-
A read-only, dict-like object for accessing information about current
|
373
|
+
A read-only, dict-like object for accessing information about the current
|
374
|
+
user.
|
39
375
|
|
40
|
-
``st.experimental_user`` is
|
376
|
+
``st.experimental_user`` is dependent on the host platform running your
|
41
377
|
Streamlit app. If the host platform has not configured the function, it
|
42
|
-
will behave as
|
378
|
+
will behave as in a locally running app.
|
379
|
+
|
380
|
+
When authentication is configured in ``secrets.toml``, Streamlit will parse
|
381
|
+
the OpenID Connect (OIDC) identity token and copy the attributes to
|
382
|
+
``st.experimental_user``. Check your provider's documentation for their
|
383
|
+
available attributes (known as claims).
|
43
384
|
|
44
|
-
|
45
|
-
|
385
|
+
When authentication is not configured, ``st.experimental_user`` has no
|
386
|
+
attributes.
|
387
|
+
|
388
|
+
You can access values via key or attribute notation. For example, use
|
389
|
+
``st.experimental_user["email"]`` or ``st.experimental_user.email`` to
|
390
|
+
access the ``email`` attribute.
|
391
|
+
|
392
|
+
.. Important::
|
393
|
+
Identity tokens include an issuance and expiration time. Streamlit does
|
394
|
+
not implicitly check these. If you want to automatically expire a
|
395
|
+
user's authentication, check these values manually and programmatically
|
396
|
+
log out your user (``st.logout()``) when needed.
|
46
397
|
|
47
398
|
Attributes
|
48
399
|
----------
|
49
|
-
|
50
|
-
|
51
|
-
``
|
400
|
+
is_logged_in: bool
|
401
|
+
Whether a user is logged in. For a locally running app, this attribute
|
402
|
+
is only available when authentication (``st.login()``) is configured in
|
403
|
+
``secrets.toml``. Otherwise, it does not exist.
|
404
|
+
|
405
|
+
Examples
|
406
|
+
--------
|
407
|
+
**Example 1: Google's identity token**
|
408
|
+
|
409
|
+
If you configure a basic Google OIDC connection as shown in Example 1 of
|
410
|
+
``st.login()``, the following data is available in
|
411
|
+
``st.experimental_user``. Streamlit adds the ``is_logged_in`` attribute.
|
412
|
+
Additional attributes may be available depending on the configuration of
|
413
|
+
the user's Google account. For more information about Google's identity
|
414
|
+
tokens, see `Obtain user information from the ID token
|
415
|
+
<https://developers.google.com/identity/openid-connect/openid-connect#obtainuserinfo>`_
|
416
|
+
in Google's docs.
|
417
|
+
|
418
|
+
Your app code:
|
52
419
|
|
53
|
-
|
54
|
-
|
420
|
+
>>> import streamlit as st
|
421
|
+
>>>
|
422
|
+
>>> if st.experimental_user.is_logged_in:
|
423
|
+
>>> st.write(st.experimental_user)
|
55
424
|
|
56
|
-
|
57
|
-
workspace. Such users appear under anonymous pseudonyms in the app's\
|
58
|
-
analytics.
|
59
|
-
- The user's email if the the user is logged in and a member of the\
|
60
|
-
app's workspace. Such users are identified by their email in the app's\
|
61
|
-
analytics.
|
425
|
+
Displayed data when a user is logged in:
|
62
426
|
|
427
|
+
>>> {
|
428
|
+
>>> "is_logged_in":true
|
429
|
+
>>> "iss":"https://accounts.google.com"
|
430
|
+
>>> "azp":"{client_id}.apps.googleusercontent.com"
|
431
|
+
>>> "aud":"{client_id}.apps.googleusercontent.com"
|
432
|
+
>>> "sub":"{unique_user_id}"
|
433
|
+
>>> "email":"{user}@gmail.com"
|
434
|
+
>>> "email_verified":true
|
435
|
+
>>> "at_hash":"{access_token_hash}"
|
436
|
+
>>> "nonce":"{nonce_string}"
|
437
|
+
>>> "name":"{full_name}"
|
438
|
+
>>> "picture":"https://lh3.googleusercontent.com/a/{content_path}"
|
439
|
+
>>> "given_name":"{given_name}"
|
440
|
+
>>> "family_name":"{family_name}"
|
441
|
+
>>> "iat":{issued_time}
|
442
|
+
>>> "exp":{expiration_time}
|
443
|
+
>>> }
|
444
|
+
|
445
|
+
**Example 2: Microsoft's identity token**
|
446
|
+
|
447
|
+
If you configure a basic Microsoft OIDC connection as shown in Example 2 of
|
448
|
+
``st.login()``, the following data is available in
|
449
|
+
``st.experimental_user``. For more information about Microsoft's identity
|
450
|
+
tokens, see `ID token claims reference
|
451
|
+
<https://learn.microsoft.com/en-us/entra/identity-platform/id-token-claims-reference>`_
|
452
|
+
in Microsoft's docs.
|
453
|
+
|
454
|
+
Your app code:
|
455
|
+
|
456
|
+
>>> import streamlit as st
|
457
|
+
>>>
|
458
|
+
>>> if st.experimental_user.is_logged_in:
|
459
|
+
>>> st.write(st.experimental_user)
|
460
|
+
|
461
|
+
Displayed data when a user is logged in:
|
462
|
+
|
463
|
+
>>> {
|
464
|
+
>>> "is_logged_in":true
|
465
|
+
>>> "ver":"2.0"
|
466
|
+
>>> "iss":"https://login.microsoftonline.com/{tenant_id}/v2.0"
|
467
|
+
>>> "sub":"{application_user_id}"
|
468
|
+
>>> "aud":"{application_id}"
|
469
|
+
>>> "exp":{expiration_time}
|
470
|
+
>>> "iat":{issued_time}
|
471
|
+
>>> "nbf":{start_time}
|
472
|
+
>>> "name":"{full_name}"
|
473
|
+
>>> "preferred_username":"{username}"
|
474
|
+
>>> "oid":"{user_GUID}"
|
475
|
+
>>> "email":"{email}"
|
476
|
+
>>> "tid":"{tenant_id}"
|
477
|
+
>>> "nonce":"{nonce_string}"
|
478
|
+
>>> "aio":"{opaque_string}"
|
479
|
+
>>> }
|
63
480
|
"""
|
64
481
|
|
65
|
-
def __getitem__(self, key: str) -> str | None:
|
66
|
-
|
482
|
+
def __getitem__(self, key: str) -> str | bool | None:
|
483
|
+
try:
|
484
|
+
return _get_user_info()[key]
|
485
|
+
except KeyError:
|
486
|
+
raise KeyError(f'st.experimental_user has no key "{key}".')
|
67
487
|
|
68
|
-
def __getattr__(self, key: str) -> str | None:
|
488
|
+
def __getattr__(self, key: str) -> str | bool | None:
|
69
489
|
try:
|
70
490
|
return _get_user_info()[key]
|
71
491
|
except KeyError:
|
72
|
-
raise AttributeError
|
492
|
+
raise AttributeError(f'st.experimental_user has no attribute "{key}".')
|
73
493
|
|
74
494
|
def __setattr__(self, name: str, value: str | None) -> NoReturn:
|
75
495
|
raise StreamlitAPIException("st.experimental_user cannot be modified")
|
streamlit/util.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
streamlit/version.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
streamlit/watcher/__init__.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|