Chapter 9 of the second book in the 
Real Python course.

Done again on a new computer after the new 
keyboard arrived