2014-09-05 150 views

回答

2

有Facebook的非官方SDK(https://github.com/pythonforfacebook/facebook-sdk)。它对于AppEngine来说非常有用,其中用户通过html/js按钮登录,并从FB cookie获取有关服务器端用户的数据。 在GitHub上的示例代码中,您可以很容易地实现代码。

通过使用得到FB的cookie的用户:

fb_user = facebook.get_user_from_cookie(request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET) 

其中Request.Cookies时是含有请求中的Cookie字典(如在GAE的webapp2的)

当你有fb_user就可以开始检索有关数据他/她:

graph = facebook.GraphAPI(fb_user["access_token"]) 
profile = graph.get_object("me") 
user_email = profile["email"] 

facebook.GraphAPI使用用户的访问令牌来授权您的来自Facebook的请求。然后你选择对象“我”,这是用户使用你的应用程序。稍后,您可以根据用户登录的登录按钮范围使用您有权使用的任何数据。

如果您正在使用webapp2 additionaly,则可以创建自定义Handler类以保存用户数据要在当前会话中使用

from webapp2_extras import sessions # import session 
config = {} 
config['webapp2_extras.sessions'] = dict(secret_key='') 

# remember to pass config to webapp2.WSGIApplication: 
app = webapp2.WSGIApplication(
    [('/', HomeHandler), ('/logout', LogoutHandler)], #handlers 
    debug=True, # debug state 
    config=config # CONFIG! 
) 

class MyHandler(webapp2.RequestHandler): 
    # ... 
    @property 
    def current_user(self): 
     # check if user logged in during this session 
     if self.session.get("user"): 
      # user is logged in 
      return self.session.get("user") 
     else: 
      # either user just logged in or just saw the first page 
      # we'll see here 
      fb_user = facebook.get_user_from_cookie(self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET) 
      if fb_user: 
       # okay so user logged in. 
       # now, check to see if existing user 

       graph = facebook.GraphAPI(fb_user["access_token"]) 
       profile = graph.get_object("me") 

       # DB # user = User.get_by_key_name(PREFIX+fb_user["uid"]) 
       # NDB # user = ndb.Key("User",PREFIX+str(profile["id"])).get() 
       # you can add prefix if you're using multiple social networks (g+, twitter) 
       if not user: 
        # not an existing user so get user info 
        # DB # user = User(key_name = PREFIX+str(profile["id"]), OTHER DATA) 
        # NDB # user = User(id = PREFIX+str(profile["id"]), OTHER DATA) 
        user.put() 
       elif user.SOMETHING_THAT_MIGHT_CHANGE != fb_user["SOMETHING_THAT_MIGHT_CHANGE"]: 
        # update values that changed since las check to database 
        user.SOMETHING_THAT_MIGHT_CHANGE = fb_user["SOMETHING_THAT_MIGHT_CHANGE"] 
        user.put() 
       # User is now logged in 
       # Save often used values to session so you don't have to query database all the time 
       self.session["user"] = dict(
        id = "f"+str(profile["id"]), 
        email = profile["email"], 
        access_token = fb_user["access_token"] 
       ) 
      return self.session.get("user") 
    return None 

    def dispatch(self): 
     self.session_store = sessions.get_store(request=self.request) 
     try: 
      webapp2.RequestHandler.dispatch(self) 
     finally: 
      self.session_store.save_sessions(self.response) 

    @webapp2.cached_property 
    def session(self): 
     return self.session_store.get_session() 

现在你可以使用你的处理程序和访问当前用户:

class MainPageHandler(Handler): 
    def get(self): 
     current_user = self.current_user 
     graph = facebook.GraphAPI(self.current_user['access_token']) 

请记住,这仅仅是基础知识,你可以学到更多的https://github.com/pythonforfacebook/facebook-sdk

+0

谢谢,我会尝试使用这个。 – 2014-09-06 03:50:44

+0

我不能得到这个工作,因为它需要请求库,并且全新的请求代码下载失败,导致错误'ImportError:No module named'requests.packages.urllib3'(截至2015年1月29日)。 – Chris 2015-01-29 19:20:40

+0

@Chris是的,所以也安装urllib3。这不是Python内置的urllib2,它是第三方库:https://urllib3.readthedocs.org/en/latest/ – Hejazzman 2015-01-30 05:44:49