Advice on filtering a CW signal for processing
The recommendation to use 4* WPM just means that you should estimate the upper limit of the WPM that you expect to receive.  High speed CW starts around 40 WPM (usually too fast to write or type the decoded signal.) So, 50WPM would be a good upper limit which means you could use a bandwidth of 200Hz.

As an alternative to what you are doing, you could use the goertzel algorithm.  That algorithm works like a narrow bandpass with a signal level detector.  You run your signal through it, and it delivers a number that tells you how strong the signal is at the center frequency that you gave the goertzel method.

This web site  gives a clear example of how to write a goertzel method to do what you are trying to accomplish.  Use the tandem goertzel to work in real time.  The example is in C, but it should be clear enough that you can translate it to python.

Varying the RESETSAMPLES value will allow you to change how narrow the filter is.  The higher RESETSAMPLES is, the narrower the filter will be.  The article suggests 200 samples, so I would start there.  If your signal is too noisy and you get a lot of bad morse code symbols, then you can make the number larger.  What I usually do is make it some multiple of the wave length of the frequency I am trying to detect in samples.  So, to detect 1kHz using 44100Hz sampling, I would first try 44 (44100/1000.) If that is too "loose" then 88, then 132 and so forth until I get a filter that is narrow enough.  If you go too high, though, you will start "smearing" the morse code symbols and won't be able to tell when one ends and the next begins.