应用程序引擎上的Facebook应用程序显示为画布iframe上的空白页

时间:2011-07-06 09:56:37

标签: python facebook google-app-engine iframe

我正试图让一个FB应用程序显示在Facebook内部的应用页面上,但iFrame只是空白。该应用程序在localhost和appspot上完美运行,但当它在facebook内部加载时没有任何反应。

如果我查看iframe的来源,则不会出现任何问题,但如果我刷新此页面,所有代码都显示正常?

我已经开启或关闭沙箱,并为localhost和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()

和主页上的JS加载

<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>

1 个答案:

答案 0 :(得分:3)

问题是来自facebook的第一个请求是作为帖子请求发送的,

//初始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/

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