2011-12-30 6 views
1

これは私の最初のウェブプログラミングの経験なので、私の質問はあまり聞こえないと思うことを願っています。私は何度もこれに執着しています。「runwithfriends」の理解facebook-appのサンプルコード

私は、サンプルコードを理解しようとしています:私はどのように情報の流れの作品は非常によく理解していないですし、どのように私は(コードが動作するすなわちどのように)そのサンプルを変更することができますしかし https://github.com/facebook/runwithfriends

を。例えば

、コードの次のセクションで:

class RecentRunsHandler(BaseHandler): 
"""Show recent runs for the user and friends""" 
def get(self): 
    if self.user: 
     friends = {} 
     for friend in select_random(
       User.get_by_key_name(self.user.friends), 30): 
      friends[friend.user_id] = friend 

     self.render(u'runs', 
      friends=friends, 
      user_recent_runs=Run.find_by_user_ids(
       [self.user.user_id], limit=5), 
      friends_runs=Run.find_by_user_ids(friends.keys()), 
     ) 
    else: 
     self.render(u'welcome') 

私は(HTMLと一緒に)理解では、同じアプリを使用している友人を示すために有用であり、私が正しく理解していれば、ここにあります重要な部分:

* friends_runs = Run.find_by_user_ids(friends.keys())*

しかし、私は、任意の友人を表示したい場合はどのような。どうしたらいいですか?

まとめると、私は知っているしたいと思います:

の1-コードの流れがどのように動作しますか?私はそう得るために、例えば、ユーザの友人のリストを表示するためのコードを操作することができますどのように

2-(私は完全に説明hereを理解していない)(同じアプリを使用している必要はありません) ? さらに、いくつかの特性(たとえば性別)でフィルタリングされた友達を表示できますか?

ありがとうございます!

答えて

1

私はFacebookのためのPythonの "SDK"を使用しました。私はhttps://gist.github.com/1190267 から取り出し、キャンバスアプリとウェブサイトの両方で使いたい機能を実現するサンプルアプリケーションのコードと組み合わせました。

ウェブサイトやキャンバスアプリケーションでFacebookを使用しているかどうかによって異なります。キャンバスアプリケーションの場合は、おそらくjavascript SDKでうまくいくかもしれませんが、「facebookでログインする」ためにはJavaScriptのオフラインで動作するサーバー側のロジックが必要でした。あなたは、特定のアプリケーションrunawayfriendsの小さな変更を試して、どのコードが何をするのかを理解することができます。

  • 取得とクッキーを設定することになりました代わりに、FBの例アプリ

  • が付属していますこのコードのためwebapp2をの組み込み機能と可能性の高いことが好ましいやっている:あなたが見ているこのプロジェクトは、しかし、いくつかの時代遅れの練習が含まれています

    OAuth 2.0でログインとログアウトが完了しましたので、あなたが見ているログインシステムは古く、OAuth 2.0(here)を使用する必要があります。私はむしろログイン/ログアウトサーバサイドを行うので、FBからのチュートリアルに記載されている認証手順に従って、ログイン/ログアウトするためのOAuth 2.0の純粋なpythonソリューションを作成しました。私は、文書化されていないユーザーをログアウトするためにクッキーをクリアする必要がありました。

  • Python 2.7にアップグレードするには、HTTPヘッダーがユニコードにキャストされないように修正する必要がありました。私はなぜ知らないが、それ以外の場合は、ヘッダは、より精巧にあなたの特定の質問に答えるために「文字列ではない」

をしたと訴え:

1)あなたが投稿のRequestHandlerクラスはとてもたBaseHandlerのサブクラスでありますあなたが投稿しているものはBAseHandlerなので、BaseHandlerクラスを見れば分かります。 BaseHandlerはレンダリングのためにdjangoテンプレートを使用し、テンプレートエンジンを慎重に変更するjinja2に切り替えることができるようにしたい場合に使用します。さらにコードは、BaseHandlerから継承したユーザオブジェクトにアクセスし、その上でいくつかの操作を行い、それをテンプレートにレンダリングします。独自のリクエストハンドラを作成し、BaseHandlerをサブクラス化して、必要な処理を行うことができます。

2)私はコードを操作することができ、私は専門家ではないので、あなたもそれを行うことができるはずです。私は、単純なFBアプリケーションでランダムな画像を表示したいと思っていました。ブロブを使ってランダムな画像を選択し、Facebookの基本機能を維持しながらテンプレートにレンダリングすることができました。グラフAPIを使用してユーザーを取得するために使用する機能、私はこれを行う:

def parse_signed_request(signed_request, secret): 
    """ 
    Parse signed_request given by Facebook (usually via POST), 
    decrypt with app secret. 

    Arguments: 
    signed_request -- Facebook's signed request given through POST 
    secret -- Application's app_secret required to decrpyt signed_request 
    """ 

    if '.' in signed_request: 
     (esig, payload) = signed_request.split('.') 
    else: 
     return {} 

    sig = urlsafe_b64decode(str(esig)) 
    data = _parse_json(urlsafe_b64decode(str(payload))) 

    if not isinstance(data, dict): 
     raise SignedRequestError('Pyload is not a json string!') 
     return {} 

    if data['algorithm'].upper() == 'HMAC-SHA256': 
     if hmac.new(secret, payload, hashlib.sha256).digest() == sig: 
      return data 
    else: 

     raise SignedRequestError('Not HMAC-SHA256 encrypted!') 

    return {} 


def get_user_from_cookie(cookies, app_id, app_secret): 
    """Parses the cookie set by the official Facebook JavaScript SDK. 

    cookies should be a dictionary-like object mapping cookie names to 
    cookie values. 

    If the user is logged in via Facebook, we return a dictionary with the 
    keys "uid" and "access_token". The former is the user's Facebook ID, 
    and the latter can be used to make authenticated requests to the Graph API. 
    If the user is not logged in, we return None. 

    Download the official Facebook JavaScript SDK at 
    http://github.com/facebook/connect-js/. Read more about Facebook 
    authentication at http://developers.facebook.com/docs/authentication/. 
    """ 
    cookie = cookies.get('fbsr_' + app_id, '') 
    if not cookie: 
     return None 
    response = parse_signed_request(cookie, app_secret) 
    if not response: 
     return None 

    args = dict(code=response['code'], client_id=app_id, 
       client_secret=app_secret, redirect_uri='') 

    file = \ 
     urllib.urlopen('https://graph.facebook.com/oauth/access_token?' 
         + urllib.urlencode(args)) 
    try: 
     token_response = file.read() 
    finally: 
     file.close() 

    access_token = cgi.parse_qs(token_response)['access_token'][-1] 
    logging.debug('returning cookie') 
    return dict(uid=response['user_id'], access_token=access_token) 

は、APIのための完全なドキュメントについてはhttp://developers.facebook.com/docs/apiを参照してください。そして、あなたは公式のFacebook JavaScript SDKをhttp://github.com/facebook/connect-js/

で得ることができます。カスタムアカウントとFacebookアカウントが共存できるように、webapp2_extras.authアカウントをFacebookブックに同期するコードを作成しています。 webapp2 groupsとカテゴリにあります。現在の私のやり方は、current_userをベースハンドラーに追加して、これをFB IDとして使用しているときに、私のウェブサイトやキャンバスアプリケーションを私のクラスFBUserのカスタムクラスとしてマージして、自分のウェブサイトやキャンバスアプリケーションをそれだけであなたはまた、セッションオブジェクトを使用して認証を解決することができますなどfacebookid、ファーストネーム、姓、としてそれは持っていないプロパティ

@property 
def current_user(self): 
    if not hasattr(self, '_current_user'): 
     self._current_user = None 
     cookie = get_user_from_cookie(self.request.cookies, 
       facebookconf.FACEBOOK_APP_ID, 
       facebookconf.FACEBOOK_APP_SECRET) 
     if cookie: 

      # Store a local instance of the user data so we don't need 
      # a round-trip to Facebook on every request 
      user = FBUser.get_by_key_name(cookie['uid']) 
      if not user: 
       graph = GraphAPI(cookie['access_token']) 
       profile = graph.get_object('me') 
       user = FBUser(key_name=str(profile['id']), 
           id=str(profile['id']), 
           name=profile['name'], 
           profile_url=profile['link'], 
           access_token=cookie['access_token']) 
       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 

を追加できるようにはExpandoモデルですwebapp2_extras.auth.models.Userあなたの認証システムを構築してください。それは私がカスタムアカウントとfacebookアカウントの両方を使用しているときに行います。my repositoryにlokを持っていれば、python 2.7を使ってGoogle App Engineでfacebookをインテグレートする方法のコード例があります。

+0

ありがとうございました。あなたの答えは最高でした!別のサンプルプロジェクトを使用したり、開始したりすることをお勧めしますか?ご承知のとおり、このプロジェクトには時代遅れの慣習がいくつか含まれています。多分、https://gist.github.com/1190267は私のような初心者にとっては良いでしょう。私はC++の低レベルプログラミングから来ています。だから、PythonやWebプログラミングは一般的に私にとっては新しいものです。 – Pdon

+0

純粋なJavascript SDKを使い始めることをお勧めします。結果は非常に簡単です。それから、私がやったように、Javascriptの処理をサーバーに移すことができます。すべてをwebapp2にアップグレードし、webapp2グループhttps://groups.google.com/forum/#!forum/webapp2で進捗状況を確認してください –

関連する問題