2011-07-06 78 views
4

我試圖讓FB應用程序顯示在Facebook的應用程序頁面上,但iFrame只是空白。該應用完美地在localhost和appspot上運行,但是當它加載到facebook裏面時什麼也沒有發生。在應用引擎上顯示爲空白頁面的Facebook應用程序iframe

如果我查看iframe的來源,什麼都沒有出現,但如果我刷新此頁面,所有的代碼顯示正常?

我試過沙盒或關閉,並有兩個獨立的應用程序設置本地主機和appspot。兩者都做同樣的事情。

這是我主要的應用程序代碼

import cgi 
import datetime 
import urllib 
import wsgiref.handlers 
import os 
import facebook 
import os.path 

from google.appengine.ext import db 
from google.appengine.api import users 
from google.appengine.ext import webapp 
from google.appengine.ext.webapp import util 
from google.appengine.ext.webapp import template 
from google.appengine.ext.webapp.util import run_wsgi_app 


#local 
FACEBOOK_APP_ID = "----------------" 
FACEBOOK_APP_SECRET = "---------------" 

#live 
#FACEBOOK_APP_ID = "--------" 
#FACEBOOK_APP_SECRET = "--------------" 




class User(db.Model): 
    id = db.StringProperty(required=True) 
    created = db.DateTimeProperty(auto_now_add=True) 
    updated = db.DateTimeProperty(auto_now=True) 
    name = db.StringProperty(required=True) 
    location = db.StringProperty(required=False) 
    profile_url = db.StringProperty(required=True) 
    access_token = db.StringProperty(required=True) 
    user_has_logged_in = db.BooleanProperty(required=True) 

class PageModel: 
    def __init__(self, user, friends): 
      self.user = user 
      self.friends = friends 
      #self.length = self.friends['data'].__len__() 








class BaseHandler(webapp.RequestHandler): 
    """Provides access to the active Facebook user in self.current_user 

    The property is lazy-loaded on first access, using the cookie saved 
    by the Facebook JavaScript SDK to determine the user ID of the active 
    user. See http://developers.facebook.com/docs/authentication/ for 
    more information. 
    """ 
    @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 logged in 
      if cookie: 

       # get user from db 
       user = User.get_by_key_name(cookie["uid"]) 
       # Store a local instance of the user data so we don't need 
       # a round-trip to Facebook on every request 
       if not user: 
        graph = facebook.GraphAPI(cookie["access_token"]) 
        profile = graph.get_object("me") 
        user = User(key_name=str(profile["id"]), 
           id=str(profile["id"]), 
           name=profile["name"], 
           location=profile["location"]["name"], 
           profile_url=profile["link"], 
           access_token=cookie["access_token"], 
           user_has_logged_in = True) 
        user.put() 
       #else if we do have a user, but their cookie access token 
       #is out of date in the db, update it 

       elif user.access_token != cookie["access_token"]: 
        user.access_token = cookie["access_token"] 
        user.put() 

       self._current_user = user 



     #user = facebook.get_user_from_cookie(self.request.cookies, FACEBOOK_APP_ID, FACEBOOK_APP_SECRET)    
      friends = "chris" 
      pageModel = PageModel(self._current_user, friends) 
      return pageModel 




     return self._current_user 


class Index(BaseHandler): 
    def get(self): 
     path = os.path.join(os.path.dirname(__file__), "index.html") 
     #args = dict(current_user=self.current_user, 
     #   facebook_app_id=FACEBOOK_APP_ID) 
     args = dict(pageModel=self.current_user, 
        facebook_app_id=FACEBOOK_APP_ID) 
     self.response.out.write(template.render(path, args)) 



application = webapp.WSGIApplication([ 
    ('/', Index), 
    ('/savemyaddress', SaveMyAddress) 
], debug=True) 


def main(): 
    run_wsgi_app(application) 
    #util.run_wsgi_app(webapp.WSGIApplication([(r"/", HomeHandler)], debug=True)) 

if __name__ == '__main__': 
    main() 

和主頁

<script> 
     window.fbAsyncInit = function() { 
     FB.init({appId: '{{ facebook_app_id }}', 
       status: true, 
       cookie: true, 
       xfbml: true}); 
     FB.Event.subscribe('{% if pageModel.user %}auth.logout{% else %}auth.login{% endif %}', function(response) { 
      window.location.reload(); 
     }); 
     }; 
     (function() { 
     var e = document.createElement('script'); 
     e.type = 'text/javascript'; 
     e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; 
     e.async = true; 
     document.getElementById('fb-root').appendChild(e); 
     }()); 
    </script> 

回答

3

的問題是,從Facebook的第一個請求是作爲一個POST請求我的JS負荷,

//最初的Facebook請求以帶有signed_request的POST進來

if u'signed_request' in self.request.POST: 
    facebook.load_signed_request(self.request.get('signed_request')) 

http://developers.facebook.com/docs/samples/canvas/

所以只是收到一個帖子的請求,它應該沒問題。

相關問題