`get_session` vs `fetch_session` -- why?

Here are the docs for Plug.Conn.get_session: Plug.Conn.html#get_session/1

And here is the key line from the docs:

Returns the whole session.

And here are the docs for Plug.Conn.fetch_session: Plug.Conn.html#fetch_session/2

And here is the key line:

Fetches the session from the session store. Will also fetch cookies.

Can anyone explain to me why there are two functions that appear to do almost the same thing? Why would I use one vs the other? What is the session store – why doesn’t get_session also get the session from the “session store”? Or does it?

Also, in a nutshell, what is the difference between a connection and a session? It seems to me like I should just be able to do something like conn.session – in fact, I don’t understand why there is something called a session if I already have a connection – why can’t any information stored in the session just be stored in the connection instead?

I don’t understand why there need to be these backflips between connections and sessions.

Session store is the place the session data is stored in between separate http requests. This by default is a cookie, but could also be some server-side database.

fetch_session does retrieve the session data from the session store to put it onto the conn of your current web request.

get_session is the API to fetch session values from the set present on conn while handling a request

After you’re done handling a certain http request the session data on conn is put back into the session storage for persistance until the next http request.

Thanks! Maybe I’ll submit a PR to the Plug.Conn docs to make it clear that fetch_session does not return the session but rather returns the connection.

Well, it says exactly that in “Specs” section of the documentation of that function.

Yes, but not everyone reads specs fluently – a lot of people prefer plain English. So rather than sending people off to do a tutorial on how to read specs, it is better just to be clear, in my opinion.

1 Like

The fact that fetch_session/2 is sparsely documented is also in part due to the fact that it is a plug and not a function you normally call yourself.