【问题标题】:Django sessions with Oauth - cannot pass variables thru request.session带有 Oauth 的 Django 会话 - 无法通过 request.session 传递变量
【发布时间】:2012-01-04 04:43:18
【问题描述】:

我正在构建一个应用程序,用于对(FB、LinkedIn 等)等网站进行 API 调用。我需要使用 OAuth 授权我的应用程序代表用户请求数据。我遇到了跨视图存储我的网站界面库(LinkedIn)实例的问题。我使用 request.session - 带有文件后端。

下面是代码http://pastebin.com/QTgqSr7W

我做错了吗?可以看到在 login() 中设置的值,但在 token() 中看不到相同的值。这是错误的期望吗?传递 api 实例的值的任何解决方法?

感谢和问候, 阿图尔。

【问题讨论】:

  • request.session 应该在您向“字典”添加内容时保存数据,但要强制保存,您可以在分配 request.session['api_obj'] 后分配 request.session.modified = True在你的 login() 定义中。
  • 我试过了,没用。就好像我失去了旧会话,这是一个新会话。
  • 我在调试时在这里观察到一些东西,_session_key 之前在 login() 视图中填充了一个值 [0eb3788d6bb409021e8d83451a9d81a9] 但在 token() 视图中它是不同的 [7128c6f9bdb347c2e4b010822b3d38a9],我猜这是罪魁祸首,但我该如何解决这个问题?

标签: python django session oauth


【解决方案1】:

hmm,我认为这是因为您正在保存整个 api python 实例,我不认为会话支持那种数据,为什么不直接将用户重定向到 auth url 而不在会话中保存某些内容,然后在回调视图中,您实例化linkedin.LinkedIn 类是这样的

from django.conf import settings

key = settings.KEY
secret = settings.SECRET
return_url = settings.CALLBACK


# You make the api connection here, so its not tied to any function
api = linkedin.LinkedIn(key, secret, return_url)

def login(request):
    if api.request_token():
        auth_url = api.get_authorize_url()
        return HttpResponseRedirect(auth_url)

#below is the view that will get called with the oauth oken.
def token(request, param):
    #do stuff with the api.

【讨论】:

  • 我试过了,没用。我需要调用 api.request_token() 才能获取访问令牌。
  • 它调用 api.request_token(),然后将用户重定向到 auth_url,如果这不是预期的行为,请说明
  • 是的,但是当我在下一个视图中松开 api 对象的状态时,它需要再次调用 request_token() 来填充 _request_token 和 _request_token_secret 变量。我尝试在我的会话中设置这些字符串值,但这也不起作用。可能是我在 Sessions 上做错了什么。
  • 我在调试时在这里观察到一些东西,_session_key 之前在 login() 视图中填充了一个值 [0eb3788d6bb409021e8d83451a9d81a9] 但在 token() 视图中它是不同的 [7128c6f9bdb347c2e4b010822b3d38a9],我猜这是罪魁祸首,但我该如何解决这个问题?
  • 哦,现在我看到了您的问题,我也遇到了同样的事情,请编辑我的答案以包含我用来解决问题的代码:D
猜你喜欢
  • 2013-08-11
  • 2011-09-25
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2018-05-03
  • 1970-01-01
相关资源
最近更新 更多