Flask - b' 文本出现在 request.data 个结果之前

Flask - b' text appears before request.data results

因此,出于调试原因,我 运行 在 Python 的 Localhost 上设置了我的应用程序一段时间,但现在我非常想制作我的 Flask 应用程序 运行 在我的 Apache Localhost 上。我已将 Vagrant 上的 Ubuntu 配置为 Apache 上的 运行 应用程序,现在唯一不起作用的是 Facebook 登录。虽然我的 Google 登录方法在 Python 的本地主机和 Apache 上都能正常工作,但我的 Facebook 登录方法 只适用于 Python 的本地主机和出于某种原因不在 Apache 的本地主机上

具体来说,在我执行 fb 登录功能的 fbconnect() 方法 中,当代码到达我的 4th print( print("4.FB http request results: %s" % result) ) 给定代码块(向下滚动代码块),第 4 次打印给出的消息是 this error:

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

我不知道 b' 在那里做什么 (它出现在错误消息的开头)如何删除它,但它也出现在第一次打印中( _print("1. Access token: %s " % access_token)_ ) :

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

没有出现第二第三打印:

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

我认为问题是由那些 b' 引起的,因为当我 运行 我的 上的应用程序时,它们没有出现在我的照片中Python Localhost 并且它们也没有出现在 Apache 上的 2nd3rd 打印中,但是 我不确定,因为它们可能会出现,因为当我在 '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 的本地主机获得的正确输出:

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

正如 Doobeh 在评论中提到的,解决方案是将客户端发送的数据解码为 UTF-8。这是一个 Python2 与 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].