Python 使用Django访问GA API:/accounts/login/redirect问题

Python 使用Django访问GA API:/accounts/login/redirect问题,python,django,oauth-2.0,google-api-python-client,oauth2client,Python,Django,Oauth 2.0,Google Api Python Client,Oauth2client,我正在开发Django应用程序,该应用程序将向用户提供有关其Google Analytics帐户的信息(帐户ID、属性、视图ID) 但我一开始就在尝试解决用户授权问题(处理oAuth 2服务器响应) 我遵循了谷歌的文档 MODELS.PY from django.db import models from django.contrib.auth.models import User from oauth2client.django_orm import FlowField, Credential

我正在开发Django应用程序,该应用程序将向用户提供有关其Google Analytics帐户的信息(帐户ID、属性、视图ID)

但我一开始就在尝试解决用户授权问题(处理oAuth 2服务器响应)

我遵循了谷歌的文档

MODELS.PY

from django.db import models
from django.contrib.auth.models import User
from oauth2client.django_orm import FlowField, CredentialsField


class FlowModel(models.Model):
    id = models.ForeignKey(User, primary_key=True)
    flow = FlowField()


class CredentialsModel(models.Model):
    id = models.ForeignKey(User, primary_key=True)
    credential = CredentialsField()
VIEWS.PY

import os
import httplib2
from oauth2client import xsrfutil
from oauth2client.client import flow_from_clientsecrets
from oauth2client.django_orm import Storage

from apiclient.discovery import build

from django.contrib.auth.decorators import login_required
from django.http import HttpResponseBadRequest
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.conf import settings
from django.contrib.auth import get_user_model
from django.core.urlresolvers import reverse
from django.contrib.sites.models import get_current_site

from .models import CredentialsModel, FlowModel

CLIENT_SECRETS = os.path.join(
    os.path.dirname(__file__), 'client_secrets.json')


def get_accounts_ids(service):
    accounts = service.management().accounts().list().execute()
    ids = []
    if accounts.get('items'):
        for account in accounts['items']:
            ids.append(account['id'])
    return ids


@login_required
def index(request):
    # use the first REDIRECT_URI if you are developing your app
    # locally, and the second in production
    REDIRECT_URI = 'http://localhost:8080/oauth2/oauth2callback'
    #REDIRECT_URI = "https://%s%s" % (
    #     get_current_site(request).domain, reverse("oauth2:return"))
    FLOW = flow_from_clientsecrets(
        CLIENT_SECRETS,
        scope='https://www.googleapis.com/auth/analytics.readonly',
        redirect_uri=REDIRECT_URI
    )
    user = request.user
    storage = Storage(CredentialsModel, 'id', user, 'credential')
    credential = storage.get()
    if credential is None or credential.invalid is True:
        FLOW.params['state'] = xsrfutil.generate_token(
            settings.SECRET_KEY, user)
        authorize_url = FLOW.step1_get_authorize_url()
        webbrowser.open_new(authorize_url)
        f = FlowModel(id=user, flow=FLOW)
        f.save()
        return HttpResponseRedirect(authorize_url)
    else:
        http = httplib2.Http()
        http = credential.authorize(http)
        service = build('analytics', 'v3', http=http)
        ids = get_account_ids(service)
        return render(
            request, 'ga_auth2/main.html', {'ids':ids})


@login_required
def auth_return(request):
    user = request.user
    if not xsrfutil.validate_token(
            settings.SECRET_KEY, request.REQUEST['state'], user):
        return HttpResponseBadRequest()
    FLOW = FlowModel.objects.get(id=user).flow
    credential = FLOW.step2_exchange(request.REQUEST)
    storage = Storage(CredentialsModel, 'id', user, 'credential')
    storage.put(credential)
    return HttpResponseRedirect("/oauth2")
url.PY

from django.conf.urls import include, url
from django.contrib import admin
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'oauth2callback', views.auth_return, name='return'),
]
问题是当我去 它正在被重定向到 我看到404错误页面没有找到

我在Google Developers控制台中定义了API项目: Javascript来源:localhost:8080

重定向uri:localhost:8080/oauth2/oauth2callback

我想象着有了这个重定向,我被推到我的谷歌帐户登录。 但当我从提示符执行Python代码时,浏览器会自动打开,要求我登录和/或授权API访问

我如何处理这个问题


提前多谢

您已使用
login\u required
保护您的索引视图,因此它会将您重定向到登录页面。如果你不想那样,就不要用那个装饰器