I think this will do it for Emacs versions < 27.1
(require 'python)
(setq python-font-lock-keywords
(append python-font-lock-keywords
'(;; this is the full string.
;; group 1 is the quote type and a closing quote is matched
;; group 2 is the string part
("f\\(['\"]\\{1,3\\}\\)\\(.+?\\)\\1"
;; these are the {keywords}
("{[^}]*?}"
;; Pre-match form
(progn (goto-char (match-beginning 0)) (match-end 0))
;; Post-match form
(goto-char (match-end 0))
;; face for this match
(0 font-lock-variable-name-face t))))))
For later versions replace python-font-lock-keywords
with python-font-lock-keywords-maximum-decoration
.
I think this works on all strings now, including multiline ones (that seems to be a tricky one in general though). I left the {} in the highlight, they get replaced and that made sense to me.
Here is what it looks like for me:

font lock is hard!
The two other posts I looked at related to this are:
Repeated regex capture for font-lock
Python mode - custom syntax highlighting.