2022-05-23 00:16:32 +04:00

125 lines
3.6 KiB
Python

# Copyright 2018-2022 Streamlit Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import List
import attr
import os
from streamlit import config
from streamlit.forward_msg_queue import ForwardMsgQueue
from streamlit.logger import get_logger
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
LOGGER = get_logger(__name__)
def get_url(host_ip: str) -> str:
"""Get the URL for any app served at the given host_ip.
Parameters
----------
host_ip : str
The IP address of the machine that is running the Streamlit Server.
Returns
-------
str
The URL.
"""
port = _get_browser_address_bar_port()
base_path = config.get_option("server.baseUrlPath").strip("/")
if base_path:
base_path = "/" + base_path
host_ip = host_ip.strip("/")
return f"http://{host_ip}:{port}{base_path}"
@attr.s(auto_attribs=True, slots=True, init=False)
class SessionData:
"""
Contains parameters related to running a script, and also houses
the ForwardMsgQueue that is used to deliver messages to a connected browser.
"""
main_script_path: str
script_folder: str
name: str
command_line: str
_browser_queue: ForwardMsgQueue
def __init__(self, main_script_path: str, command_line: str):
"""Constructor.
Parameters
----------
main_script_path : str
Path of the Python file from which this app is generated.
command_line : string
Command line as input by the user
"""
basename = os.path.basename(main_script_path)
self.main_script_path = os.path.abspath(main_script_path)
self.script_folder = os.path.dirname(self.main_script_path)
self.name = str(os.path.splitext(basename)[0])
# The browser queue contains messages that haven't yet been
# delivered to the browser. Periodically, the server flushes
# this queue and delivers its contents to the browser.
self._browser_queue = ForwardMsgQueue()
self.command_line = command_line
def enqueue(self, msg: ForwardMsg) -> None:
self._browser_queue.enqueue(msg)
def clear_browser_queue(self) -> None:
"""Clear all pending ForwardMsgs from our browser queue."""
self._browser_queue.clear()
def flush_browser_queue(self) -> List[ForwardMsg]:
"""Clear our browser queue and return the messages it contained.
The Server calls this periodically to deliver new messages
to the browser associated with this session.
Returns
-------
list[ForwardMsg]
The messages that were removed from the queue and should
be delivered to the browser.
"""
return self._browser_queue.flush()
def _get_browser_address_bar_port() -> int:
"""Get the app URL that will be shown in the browser's address bar.
That is, this is the port where static assets will be served from. In dev,
this is different from the URL that will be used to connect to the
server-browser websocket.
"""
if config.get_option("global.developmentMode"):
return 3000
return int(config.get_option("browser.serverPort"))