Since Python 3.3, hash randomization is enabled by default for security reasons.
The concern is that an attacker can feed a specially crafted program input that led to many hash collisions. This will cause the dictionary to perform at worse case scenario and may effectively cause a denial of service on a system.
Many other languages that are often used for web programming also implemented hash randomization in roughly the same timeframe with their respective hash maps.
Prior to hash randomization being implemented, due to collision resolution and internal hash table resizing you may not end always up with the same order if you use different sequence of inserts and removes that produces the same set of final keys, but you'd usually get the same ordering in a dictionary when you insert and remove keys in the same sequence. However, this was an accident of implementation, which was never guaranteed by the language specification.