2011-07-06 79 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/

所以只是收到一个帖子的请求,它应该没问题。

相关问题