> For example, I would like something like Go's Context for passing temporary per-request data through middlewares...maybe this is possible with Axum but I'm not seeing a straightforward approach
That's probably more of a Tower(-http) thing. It's the bit which handles all the middleware, Tower is layered over that.
> Extensions also seem to be kinda magical and not straightforward
Yeah, the problem is that they come directly from the http crates so everything that's built on top assumes you know what it is.
The reality is that Extensions are just a typemap, meaning it's a k:v where keys are types. So you can define your own state type, shove it in the Extension, and know that you'll be able to retrieve that and there will be no collision (because it's your state type). For a more complete introduction, see https://blog.adamchalmers.com/what-are-extensions/
It's one of those topic which is so obvious afterwards that it's easy to forget it's completely opaque and obscure beforewards.