« first day (3666 days earlier)      last day (1015 days later) » 

6:50 PM
@Patriot I don't know how I missed that item, but yeah... Um, you just generate a crypto secure random in a range [0..N) where N is the alphabet size using a well seeded PRNG, then you select a character from the alphabet using the returned index. Loop until enough characters have been generated.
docs.python.org/3/library/secrets.html#module-secrets has a link to the system random number generator, which is fine if you don't want super high or multi-threaded performance.
Ah, it is better explained here. You can use the choicemethod as well, in all probability, so you can directly include a string representing the alphabet.
 

« first day (3666 days earlier)      last day (1015 days later) »