requirements.txt don't track transitive dependencies. Your project could break if a dependency decided to swap out its own dependencies. This isn't theoretical either - it happened to us in production.
We are using `pip-tools` to manage that: https://github.com/jazzband/pip-tools