Requirements are literally the packages your project requires to run,down to a specific version if you wish.
Constraints specifies what version of a package to install IF the package is required by your requirements, or by transitive requirement (required by packages you require). If package is not required, the constraint is not used.
I tend to use requirements file to list direct dependencies of my project and their versions. Constraints is useful to pin down and transitive dependencies to make sure they're not accidentally upgraded (repeatable builds) . Also if the 3rd party package drops a requirement you don't have to worry that it'll still be installed if it's still on your constraints. It'll simply not be installed.