代码之家  ›  专栏  ›  技术社区  ›  Arne

如何在pyJWT中将列表或dict用作命令行参数

  •  1
  • Arne  · 技术社区  · 7 年前

    下面的python代码使用 pyjwt

    >>> import jwt
    >>> payload = {'nested': [{'name': 'me', 'id': '1'}]}
    >>> token = jwt.encode(payload, 'secret')
    >>> token.decode()
    ey[...]ko0Zq_k
    

    the docs 仅显示带有 = 分隔的键值对,而不是嵌套的有效负载。

    我最好的猜测是:

    $ pyjwt --key=secret encode nested=[{name=me, id=1}]
    ey[...]0FRW9gyU  # not the same token as above :(
    

    但没用。是不是根本不支持?

    1 回复  |  直到 7 年前
        1
  •  1
  •   r.ook jpp    7 年前

    如前所述,您的命令行令牌在解码时返回 json 对象:

    {'nested': '[{name=me,', 'id': '1}]'}

    快速潜入水中 __main__.py 属于 jwt

    ... snipped
    
    def encode_payload(args):
        # Try to encode
        if args.key is None:
            raise ValueError('Key is required when encoding. See --help for usage.')
    
        # Build payload object to encode
        payload = {}
    
        for arg in args.payload:
            k, v = arg.split('=', 1)
    
        ... some additional handling on v for time, int, float and True/False/None
        ... snipped
    

    如您所见,有效负载的键和值直接基于 split('=', 1) =

    总之, 嵌套的 dict 不支持CLI中的 .

    1. 直接从Python的CLI运行一个即兴语句,如下所示:

      > python -c "import jwt; print(jwt.encode({'nested':[{'name':'me', 'id':'1'}]}, 'secret').decode('utf-8'))"
      
      # eyJ...Zq_k
      

    不太理想,但它能满足你的需要。

    1. import sys, jwt
      my_json = sys.argv[0]
      token = jwt.encode(eval(my_json), 'secret')
      print(token.decode('utf-8'))
      
      # run in CLI
      > python my_encode.py "{'nested':[{'name':'me', 'id':'1'}]}"
      
      # eyJ...Zq_k
      

    注意使用 eval() 这里是 不理想 argv 他更小心了。

    1. 可以 尝试修改 Lib\site-packages\jwt\__main__.py 在增加官方支持之前,根据您的需要发挥作用(风险自负)。我要提醒您,在考虑修改主代码之前,您应该对编写自己的解析相当满意。在我意识到你将遇到的限制之前,我试了几次:

      encode() 方法不考虑 list 作为一个有效的JSON对象(但它应该)。所以一开始你就有一个 口述 就像要操纵的弦。

      int float 如果可能的话。你需要以某种方式摆脱它,或者完全改变它处理数字的方式。

      我的尝试是这样的:

      def func(result, payload):
          for arg in payload:
              k, v = arg.split('=', 1)
      
              if v.startswith('{') and v.endswith('}'):
                  result[k] = func({}, v[1:-1])
              else:
              ... the rest of the existing code
      

      k , v 对,我需要进一步处理另一个分隔符 , 列表 s、 可能会变得更混乱。这是绝对可行的,而且效果是立竿见影的,也就是说,CLI直接运行于此 __主\uuuuuuuuuuuy.py

    克服这些问题以达到你所需要的可能比必要的更多,这取决于你的技能和舒适度。所以选择你的战斗。。。如果CLI不是绝对必要的,我建议使用 .py 方法。