Calls read function after file upload

Summary

Hi, I have an app which accepts file upload. When I upload, it calls a read function. Then from the file, I show some options as multiselect, when I submit the multiselect option, the read function calls again. I tried caching or session state but it is not working. Can someone help?

Steps to reproduce

Code snippet:

@st.cache_data(show_spinner=False)
def read_file(file):
    with tempfile.NamedTemporaryFile(mode="wb") as temp:
        with st.spinner('This may take a while. Wait for it...'):
            bytes_data = file.getvalue()
            temp.write(bytes_data)
            df = MyFunctionReadsFromPathAndAggregations(temp.name)
            return df


def app():
    session_state = st.session_state
    if "df" not in session_state:
        file = st.file_uploader("Upload file.")
        if file is not None:
            df = read_file(file)
            with st.form(key='my_form_to_submit'):
                selected_authors = st.multiselect(
                    "Choose authors of the group",
                    df.author.unique().tolist())
            
                submit_button = st.form_submit_button(label='Submit')

            if submit_button:
                  # do the things

Expected behavior:

I expect to run my function inside read_file once. After reading, I show some keys from dataframe as multiselect, then user selects the scope and submits. Now it should not read dataframe again.

Actual behavior:

After clicking submit, it recalls read_file again.

Debug info

The function is called after submitting because your code calls it, but the dataframe is not read again, the cached value is returned instead.

I’m not sure I followed. I’ve uploaded two log screenshots. As you can see, it seems like it does the operations once again.

image

edit: I think I get what you are saying. I’ve just removed

df = MyFunctionReadsFromPathAndAggregations(temp.name)

part from read_file function, and return temp.name. It still does the same thing.

That seems unrelated to the code you posted so I cannot help with it. When I fill the missing parts in your code and run it, the body of read_file() is called only once. That is all I can say.

Ok thanks, I’ll dig into more to find my mistake.

Looks like it is was a bug. fyi.

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.