请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

decode的时候,用utf8还是ascii? 如何选择?

token.py的get_token函数中 最后, 

`t = {'token': token.decode('ascii')}`    

 对于bytes类型的字符串, 什么时候decode('utf8')什么时候decode('ascii')? 这里能用decode('utf8')代替decode('ascii')吗?

正在回答 回答被采纳积分+3

3回答

老卢123123 2018-07-27 14:12:57
def generate_auth_token(uid,ac_type,scope=None,expiration=7200):
    '''
    :param uid: 用户id
    :param ac_type:active_type,客户端类型
    :param scope: 作用域
    :param expiration: 有效时间
    :return: token
    '''
    s = Serializer(current_app.config['SECRET_KEY'],
                   expires_in=expiration)
    return s.dumps({
        'uid':uid,
        'type':ac_type.value,
    }).decode('utf-8')

如上述代码,在生成token都方法里,直接return decode('utf-8')后都token,运行成功,目前没发现问题

@api.route('',methods=['POST'])
def get_token():
    form = ClientForm().validate_for_api()
    promise = {
        ClientTypeEnum.USER_EMAIL:User.verify
    }
    identity = promise[form.type.data](
        form.account.data,
        form.secret.data
    )
    # identity为用户uid,开始生成token
    expiration = current_app.config['TOKEN_EXPIRATION']
    token = generate_auth_token(identity['uid'],
                                form.type.data,
                                None,
                                expiration)
    t = {
        'token':token
    }
    return Success(msg=t)

postman收到都返回也是正确的

{
    "error_code": 0,
    "msg": {
        "token": "eyJhbGciOiJIUzI1NiIsImlhdCI6MTUzMjY3MTk0NiwiZXhwIjoxNTMyNzU4MzQ2fQ.eyJ1aWQiOjE0LCJ0eXBlIjoxMDB9.t4Q_-ju8LclM3yBVfu5Yb_0_ejqw4ZJZiWGjz7GqfiI"
    },
    "request": "POST /v1/token"
}


0 回复 有任何疑惑可以回复我~
老卢123123 2018-07-27 14:07:46

上一期的高级编程中,有一节课,发送电子邮件重置密码的

当时使用都是decode('utf-8')'

    def generate_token(self, expiration=600):
        s = Serializer(current_app.config['SECRET_KEY'], expiration)
        return s.dumps({'id': self.id}).decode('utf-8')

验证token时也是encode('utf-8)

    @staticmethod
    def reset_password(token, new_password):
        s = Serializer(current_app.config['SECRET_KEY'])
        try:
            data = s.loads(token.encode('utf-8'))
        except:
            return False
        user = User.query.get(data.get('id'))
        if user is None:
            return False
        user.password = new_password
        db.session.commit()
        return True

A`为什么现在需要使用decode('ascii')?

B`是什么原因导致两种情况下都不同用法,我们如何选择?

0 回复 有任何疑惑可以回复我~
  • 7七月 #1
    你这是不一样的呀,因为你在调用jwt生成的函数时,别人给你的就是ascii编码呀。别人给你的是什么,你就要用什么
    回复 有任何疑惑可以回复我~ 2018-07-28 16:07:05
  • 7七月 #2
    这里我觉得你太纠结了吧,这个编码人家是怎么编码的你就要用什么呀。
    回复 有任何疑惑可以回复我~ 2018-07-28 16:17:41
7七月 2018-07-05 08:07:51

utf-8会报错

0 回复 有任何疑惑可以回复我~
  • 上一期课程还是utf8,这次是ascii,所以,对于bytes类型的字符串, 什么时候decode('utf8')什么时候decode('ascii')?
    回复 有任何疑惑可以回复我~ 2018-07-27 01:08:59
  • 7七月 #2
    上一期课程是指什么?
    
    回复 有任何疑惑可以回复我~ 2018-07-27 02:40:41
  • 老卢123123 回复 7七月 #3
    flask 高级编程,当时在发送邮件找回密码时,也用到了Serializer进行加密,s = Serializer(current_app.config['SECRET_KEY'], expiration)  然后s.dumps({'id':self.id}).decode('utf-8')来return
    回复 有任何疑惑可以回复我~ 2018-07-27 13:58:55
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信