烧瓶-b'文本出现在request.data结果之前

时间:2019-08-03 10:08:19

标签: python-3.x python-2.7 flask python-requests facebook-access-token

因此,出于调试原因,我有一段时间在 Python的Localhost 上运行我的应用程序,但是现在我非常想让 Flask 应用程序在我的上运行Apache Localhost 。我已经在Vagrant上配置了Ubuntu,以在Apache上运行该应用程序,而现在唯一不起作用的是Facebook登录。虽然我的Google登录方法在Python的Localhost和Apache上都可以正常工作,但是我的Facebook登录方法由于某种原因仅在Python的Localhost上有效,而在Apache的Localhost上不适用

具体来说,当代码到达我的第4个打印 print(“ 4。”)时,在执行fb登录功能的 fbconnect()方法中, FB http请求结果:给定代码块的%s“%结果))(向下滚动代码块),第4条打印显示的消息为此错误

4. FB http request results: b'{"error":{"message":"Invalid OAuth access token.","type":"OAuthException","code":190,"fbtrace_id":"AjWGMxq54MULV0sCpjpW2DT"}}'

我不知道 b'在这里做什么(它出现在错误消息的开头)以及如何删除它< / strong>,但它也会出现在第一个打印文件中(_print(“ 1。访问令牌:%s”%access_token)_):

1. Access token: b'EAAE7dgXeMUup...'

,它不会出现在第二张第三张印刷品中:

2. App ID: 3425...
3. App secret: 75a2...

我认为问题是由这些 b'引起的,因为当我在 Python Localhost 上运行应用程序时,它们没有出现在我的打印品中出现在Apache上的第2 3rd 印刷品中,但我不确定,因为它们可能会出现,因为印刷输出在我将消息写在“ print.log”文件中,因为Apache实际上并不像Python的Localhost那样将消息输出到终端。 这是我的 fbconnect()方法

def fbconnect():

    ''' Validate state token, by confirming that the token that the client sends
    to the server matches the token that the server sent to the client. This
    round-trip verification helps ensure that the user is making the request
    not a malicious script. Using the request.args.get() method, we examine
    the state token passed in by the ajax request and compare with the state
    of the login_session. If these 2 do NOT match, we create a response of an
    invalid state token and return this message to the client. '''

    if request.args.get('state') != login_session['state']:
        response = make_response(json.dumps('Invalid state parameter.'), 401)
        response.headers['Content-Type'] = 'application/json'
        return response
    access_token = request.data
    print("1. Access token: %s " % access_token)

    # Get Facebook app ID.
    app_id = json.loads(open('/vagrant/Inhinito/fb_client_secrets.json', 'r').read())['web']['app_id']
    print("2. App ID: %s " % app_id)

    # Get Facebook app secret.
    app_secret = json.loads(open('/vagrant/Inhinito/fb_client_secrets.json', 'r').read())['web']['app_secret']
    print("3. App secret: %s " % app_secret)

    # Make http request to the Facebook API.
    url = "https://graph.facebook.com/oauth/access_token?client_id=%s" % (app_id)
    url += "&client_secret=%s&grant_type=fb_exchange_token" % (app_secret)
    url += "&fb_exchange_token=%s" % (access_token)
    http = httplib2.Http()
    result = http.request(url, 'GET')[1]
    print("4. FB http request results: %s" % result)

    ....

这是我从Python的Localhost获得的正确输出:

1. Access token: EAgE7...
4. FB http request results: {"access_token":"EAgE7...","token_type":"bearer","expires_in":5183999}

1 个答案:

答案 0 :(得分:1)

正如Doobeh在评论中提到的那样,解决方案是对客户端发送到UTF-8的数据进行解码。这是一个{strong> Pytho2 vs Python3 问题,here详细说明。

b''显然用于表示字符串是 binary ,而不是Unicode。 解决方法是使用 access_token = request.data.decode('UTF-8') 代替 access_token = request.datahttp.request(url, 'GET')[1].decode('UTF-8')而不是http.request(url, 'GET')[1]