Как правильно написать функцию Python, которая считывает ключи из отдельного файла json

#python #python-3.x

#python #python-3.x

Вопрос:

Я работаю над скриптом python, который будет считывать json и искать определенный ключ. Пока что я могу заставить ее работать, если я включу свои значения json в качестве переменной. Однако моя конечная цель — прочитать значения json из файла. Вот код, над которым я работал:

 import jwt
import os

jwks = {
  "keys": [
    {
      "kty": "RSA",
      "use": "sig",
      "kid": "123456ABCDEF",
      "x5t": "123456ABCDEF",
      "n": "qa9f6h6h52XbX0iAgxKgEDlRpbJw",
      "e": "AQAB",
      "x5c": [
        "43aw7PQjxt4/MpfNMS2BfZ5F8GVSVG7qNb352cLLeJg5rc398Z"
      ]
    },
    {
      "kty": "RSA",
      "use": "sig",
      "kid": "987654ghijklmnoP",
      "x5t": "987654ghijklmnoP",
      "n": "qa9f6h6h52XbX0iAgxKgEDlRpbJw",
      "e": "AQAB",
      "x5c": [
        "1234R46Qjxt4/MpfNMS2BfZ5F8GVSVG7qNb352cLLeJg5rc398Z"
      ]
    } 
  ]
}


class InvalidAuthorizationToken(Exception):
    def __init__(self, details):
        super().__init__('Invalid authorization token: '   details)


def get_jwk(kid):
    for jwk in jwks.get('keys'):
        if jwk.get('kid') == kid:
            print ('This is jwk:', jwk)
            return jwk
    raise InvalidAuthorizationToken('kid not recognized')


#Execute
get_jwk('123456ABCDEF')
get_jwk('987654ghijklmnoP')
  

Здесь я пытаюсь заменить те же значения и сохранить их в отдельном файле (jwks-keys) и прочитать его как переменную. Однако я получаю следующую ошибку и не понимаю, что я сделал. Как мне правильно сконструировать эту функцию?

Вот трассировка:

 Traceback (most recent call last):
  File "printjwks2.py", line 59, in <module>
    get_jwk('123456ABCDEF')
  File "printjwks2.py", line 51, in get_jwk
    for jwk in jwks.get('keys'):
AttributeError: 'str' object has no attribute 'get'
  

Вот функция:

 def get_jwk(kid):
    with open('testkeys/jwks-keys', 'r') as az:
        jwks = az.read()
    for jwk in jwks.get('keys'):
        if jwk.get('kid') == kid:
            print (jwk)
            return jwk
    raise InvalidAuthorizationToken('kid not recognized')
  

Комментарии:

1. Ваш первый jwks — это dict. Когда вы читаете что-то из файла, это просто строка. Возможно, вы хотите ее декодировать в формате JSON?

Ответ №1:

 with open('testkeys/jwks-keys', 'r') as az:
        jwks = az.read()
  

Здесь jwks просто объект string, потому что az.read() возвращает его в виде строки . Таким образом, вы должны десериализовать данные JSON в объекты Python перед применением jwks.get('keys') .

 >>> sample_json = '{"json_key": "json_value"}'
>>> sample_json.get("json_key")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'get'
>>> import json
>>> json.loads(sample_json).get("json_key")
'json_value'
  

Поскольку вы читаете JSON из файла, вы можете использовать json.load для десериализации fp (текстовый файл с поддержкой .read() или двоичный файл, содержащий документ JSON) в объект Python

 >>> import json
>>> with open('testkeys/jwks-keys', 'r') as az:
...    jwks = json.load(az)