【问题标题】:Getting credential using GoogleAPI - HttpResponseRedirect status_code=302使用 GoogleAPI 获取凭据 - HttpResponseRedirect status_code=302
【发布时间】:2018-07-30 20:22:51
【问题描述】:

我收到此错误: HttpResponseRedirect' 对象没有属性 'authorize'

我已经打印了 HttpResponseRedirect 对象并且我有这样的东西:

HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="https://accounts.google.com/o/oauth2/auth?client_id=..."强>

我已将此网址复制到我的浏览器,它确实有效。

当我在本地运行应用程序时,一切正常,但现在我最近将我的应用程序移动到 pythonanywhere 并且它停止了工作。这是我的代码:

def get_credentials(user):

    home_dir = os.path.expanduser('~')
    home_dir = BASE_DIR + '/oauth2/' + user.username
    credential_dir = os.path.join(home_dir, '.credentials')
    if not os.path.exists(credential_dir):
        os.makedirs(credential_dir)
    credential_path = os.path.join(credential_dir, 'calendar-python-quickstart.json')
    storage = Storage(credential_path)
    credentials = storage.get()
    if not credentials or credentials.invalid:
        print(True)
        FLOW = client.flow_from_clientsecrets(CLIENT_SECRET_FILE, SCOPES,redirect_uri="http://XXXXXX.pythonanywhere.com/accounts/google/login/callback/")
        FLOW.params['state'] = xsrfutil.generate_token(SECRET_KEY,
                                                       user)
        authorize_url = FLOW.step1_get_authorize_url()
        return HttpResponseRedirect(authorize_url)
    return credentials


class EventTeamToggleAPI(LoginRequiredMixin, APIView):

    authentication_classes = (authentication.SessionAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)

    def get(self, request, *args, **kwargs):
        self.slug = self.kwargs.get('slug')
        team = get_object_or_404(Team,slug=self.slug)
        updated = False
        added = False
        user_other_teams = Team.objects.filter(user_team_events=self.request.user).exclude(pk=team.pk)
        games = Game.objects.filter(Q(team_home=team) | Q(team_away=team))
        if self.request.user.google_cal==True:
            credentials = get_credentials(self.request.user)
            http = credentials.authorize(Http())
            service = build('calendar', 'v3', http=http)
            {...}

        return(...)

有人可以向我解释这是什么问题吗? 谢谢

【问题讨论】:

    标签: python django google-oauth pythonanywhere http-status-code-302


    【解决方案1】:

    在 get_credentials 的一个代码路径中,您将返回一个凭据对象,而在另一个代码路径中,您将返回一个 HttpResponseRedirect。

    【讨论】:

    • 对不起,我不明白。你可以说得更详细点吗?问题是服务器上的这段代码不会产生这个谷歌弹出窗口来提供凭据,我得到一个错误:HttpResponseRedirect'对象没有属性'authorize'在我的计算机上本地它工作正常。当我将它移到 pythonanywhere 时它停止工作。
    • 您有一个名为get_credentials 的函数。在您看来,您拨打get_credentials,然后拨打credentials.authorize(Http())。因此,如果函数 get_credentials 返回一个未定义方法 authorize 的对象,您将收到您描述的错误。在get_credentials 中,您返回从存储中获得的credentials 对象,如果凭据存在并且它们有效,则该对象可能定义了该方法,但如果凭据不存在,则返回一个 HttpResponseRedirect 对象,它没有定义那个方法。
    • 我怀疑您的本地计算机和 PythonAnywhere 之间的区别在于,if not credentials or credentials.invalid: 在前者上为真,在后者上为假。确切地说,为什么在不了解更多有关 API 的情况下很难说,但无论哪种方式,您都有一个方法返回不同类型的对象,具体取决于请求中的凭据是否有效,这可能是您应该解决的问题。
    • 我建议从 get_credentials 返回 None 而不是重定向,然后将 if 语句中的代码放入视图中。
    • 我知道我从授权中得到一个错误,因为 get_credentials 返回的对象没有定义方法。但这是为什么呢?为什么我不能弹出这个谷歌登录窗口来传递凭据?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 2015-12-05
    • 2019-07-16
    • 2022-06-10
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多