Skip to main content
 首页 » 编程设计

python之如何存储 facebook-sdk 给出的用户,而不是每个请求都调用一次

2025年05月04日23JustinYoung

我有以下代码(取自 facebook-sdk appengine example ):

class BaseHandler(webapp2.RequestHandler): 
    @property 
    def current_user(self): 
        if not hasattr(self, "_current_user"): 
            self._current_user = None 
            cookie = facebook.get_user_from_cookie( 
                self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET) 
            if cookie: 
                user = User.get_by_key_name(cookie["uid"]) 
                if not user: 
                    graph = facebook.GraphAPI(cookie["access_token"]) 
                    profile = graph.get_object("me") 
                    user = User(key_name=str(profile["id"]), ...) 
                    user.put() 
                elif user.access_token != cookie["access_token"]: 
                    user.access_token = cookie["access_token"] 
                    user.put() 
                self._current_user = user 
        return self._current_user 

我遇到了 Issue #23 中描述的确切问题

项目中包含的来自 Google App Engine 的示例会在每次请求时调用 get_user_from_cookie,它现在会向 Facebook 发送请求。该示例应缓存返回的访问 token ,以免发生这种情况。

我该如何解决这个问题?我担心的一个问题是,如果我将它们存储在 session 中,我怎么知道访问 token 有效?

请您参考如下方法:

get_user_from_cookie 调用 facebook 以获取访问 token ,访问 token 可以在其过期期间缓存(使用 memache)(调用 facebook 获取访问 token 时也会过期)。

获取访问 token 的步骤应该是:

  1. 检查它是否缓存在类(处理程序)级别。
  2. 检查它是否缓存在 memache 中。
  3. 来自 facebok 的 Restive,并将其缓存(用于 token 的使用)
  4. 如果由于过期而失败,则使用访问 token 检索它(并缓存它)。