【问题标题】:TypeError: prepare_request_body() got multiple values for keyword argument 'redirect_uri'TypeError:prepare_request_body() 为关键字参数“redirect_uri”获取了多个值
【发布时间】:2015-05-18 17:07:18
【问题描述】:

我正在尝试将 Google OAuth2 与 requests-oauthlib 一起使用。 我已经尝试使用 Ajax 和其他东西,但是为了使用 Google OAuth2 数据登录到 Django 后端,似乎我必须使用像这样的库。 (因为他们提供了一个现成的中间件和一个身份验证后端,我不想写那些东西)

我遇到的另一个问题是我使用基于类的视图,但教程只显示基于函数的视图。

好吧,在我从 Google 获得我的代码后,我正在尝试获取访问令牌。问题是我无法让它工作。

这就是神奇发生的地方(嗯..不是真的):

class LoginView(RedirectView):

    authorization_base_url = r'https://accounts.google.com/o/oauth2/auth'
    token_url = r'https://accounts.google.com/o/oauth2/token'
    client_id = r'Totally forgot that one'
    client_secret = r'Super, super secret'
    redirect_uri = 'http://localhost:8000/de/callback'
    scope = [r'email',
             r'https://www.googleapis.com/auth/userinfo.profile']

    def get(self, request):

        google = OAuth2Session(self.client_id,
                               redirect_uri = self.redirect_uri,
                               scope=self.scope)

        authorization_url, state = google.authorization_url(
                                    self.authorization_base_url,
                                    access_type='offline',
                                    approval_prompt="force")

        request.session['oauth_state'] = state

        return redirect(authorization_url)

这很好用。 接下来,在我从 Google 回来后:

class CallbackView(RedirectView):

    def get(self, request):
        r = request.GET.copy()

        google = OAuth2Session(LoginView.client_id,
                               state = request.session['oauth_state'])

        authorization_response = (LoginView.redirect_uri + 
                             "/callback?state=" + request.session['oauth_state'] + 
                             "&code=" + r['code'])

        token = google.fetch_token(LoginView.token_url,
                                   authorization_response = authorization_response,
                                   client_secret = LoginView.client_secret,
                                   redirect_uri = LoginView.redirect_uri,
                                   )

    ...

当然还有我的 Traceback:

Traceback:
File "/home/patrik/.virtualenvs/cms/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/patrik/.virtualenvs/cms/local/lib/python2.7/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)
File "/home/patrik/.virtualenvs/cms/local/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
  87.         return handler(request, *args, **kwargs)
File "/home/patrik/Schreibtisch/cms/cmsproject/apps/topics/views.py" in get
  106.                                    redirect_uri = LoginView.redirect_uri,
File "/home/patrik/.virtualenvs/cms/local/lib/python2.7/site-packages/requests_oauthlib/oauth2_session.py" in fetch_token
  167.                 password=password, **kwargs)

Exception Type: TypeError at /de/callback
Exception Value: prepare_request_body() got multiple values for keyword argument 'redirect_uri'

那个错误来自哪里?

【问题讨论】:

    标签: python django google-oauth typeerror django-class-based-views


    【解决方案1】:

    fetch_token() 方法不应传递redirect_uri 参数。它将从实例属性google.redirect_uri 中提供此参数。

    换句话说,将其交给OAuth2Session 构造函数:

    google = OAuth2Session(
        LoginView.client_id,
        state = request.session['oauth_state'],
        redirect_uri = LoginView.redirect_uri)
    

    【讨论】:

    • 非常感谢。做到了!
    猜你喜欢
    • 2013-08-04
    • 2016-06-24
    • 1970-01-01
    • 2013-03-09
    • 2016-04-25
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多