【问题标题】:Different return when using base64.encodestring with database and session variable将 base64.encodestring 与数据库和会话变量一起使用时返回不同
【发布时间】:2016-05-12 09:52:33
【问题描述】:

我正在尝试执行 API 请求,我需要 API 密钥来查看不同的视图。我正在尝试使用会话变量,但密钥似乎采用其他格式,而不是尝试使用 Sqlite 数据库中的变量。 API 请求使用数据库中的密钥,但不能使用会话变量

我如何从数据库和会话中获取 API 密钥:

key_session = request.session['key']
key_db = APIkey.objects.values_list('key', flat=True).get(pk=2)

当我打印它们时,它们都返回相同的值。关键示例:

3h3asdh-asdasd:oisf87sdf87a5df76asdf83jhjhasgd8

我在尝试使用我的密钥对 API 服务进行身份验证时使用 base64.encodestring 函数:

query = request.GET.get('query')
url =  urllib2.Request('https://api.someapiwebsite.com', 
        None, headers={'Content-Type':'application/json'})
base64string = base64.encodestring('%s' % (key_session)).replace('\n', '')

如果我使用会话变量 (key_session) 打印 base64string,我会得到:

MmoihjsdasdoihhaG5tbjpuq9876eq9asd98a7Nmd3dWYzN2JmbWZ2aW1nMGVw==

如果我使用会话变量 (key_db) 打印 base64string,唯一的区别是最后两个字符 == 现在是 'IC',我认为这就是身份验证的原因到 API 服务失败:

MmoihjsdasdoihhaG5tbjpuq9876eq9asd98a7Nmd3dWYzN2JmbWZ2aW1nMGVwIC

base64 编码的字符串有何不同?

编辑:

我可以看到使用 print repr() 时的区别:

print repr(key_db)
3h3asdh-asdasd:oisf87sdf87a5df76asdf83jhjhasgd8
print repr(key_session)
3h3asdh-asdasd:oisf87sdf87a5df76asdf83jhjhasgd8\x02\x02

【问题讨论】:

  • 使用repr,即print(repr(key_db)而不是print(key_db)。它可能表明其中一个字符串有尾随空格。
  • 这显示了区别:key_session 最后有 \x02\x02 值,但 key_db 没有。 key_session 有什么不同?
  • 我不知道为什么request.session['key'] 不同。也许这是设置它的代码的问题。您可以在编码之前剥离字符。

标签: python django sqlite django-views


【解决方案1】:

其中一个字符串可能包含print 未显示的一些尾随字符。如果您使用repr,那么您应该能够看到有什么区别。

print(repr(key_session))
print(repr(key_db))

然后,您可以在对字符串进行编码之前根据需要去除任何字符,例如:

key_session = key_session.rstrip('\x02')

【讨论】:

    猜你喜欢
    • 2011-05-12
    • 2011-07-27
    • 1970-01-01
    • 2020-01-21
    • 2014-05-11
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多