2010-02-27 31 views
1

我有一個託管在Google App Engine上的Python Facebook項目,並使用下面的代碼來處理使用PyFacebook的Facebook API的初始化。使用PyFacebook和Google App Engine循環重定向

# Facebook Initialization 
def initialize_facebook(f): 

    # Redirection handler 
    def redirect(self, url): 
     logger.info('Redirecting the user to: ' + url) 
     self.response.headers.add_header("Cache-Control", "max-age=0") 
     self.response.headers.add_header("Pragma", "no-cache") 
     self.response.out.write('<html><head><script>parent.location.replace(\'' + url + '\');</script></head></html>') 
     return 'Moved temporarily' 

    auth_token = request.params.get('auth_token', None) 
    fbapi = Facebook(settings['FACEBOOK_API_KEY'], settings['FACEBOOK_SECRET_KEY'], auth_token=auth_token) 

    if not fbapi: 
     logger.error('Facebook failed to initialize') 

    if fbapi.check_session(request) or auth_token: 
     pass 
    else: 
     logger.info('User not logged into Facebook') 
     return lambda a: redirect(a, fbapi.get_login_url()) 

    if fbapi.added: 
     pass 
    else: 
     logger.info('User does not have ' + settings['FACEBOOK_APP_NAME'] + ' added') 
     return lambda a: redirect(a, fbapi.get_add_url()) 

    # Return the validated API 
    logger.info('Facebook successfully initialized') 
    return lambda a: f(a, fbapi=fbapi) 

我試圖設定,讓我可以在任何頁面處理方法丟棄這個裝飾,並驗證用戶的一切設置正確。問題是,當重定向處理程序被調用時,它會啓動無限循環的重定向。

我嘗試使用HTTP 302重定向來代替JavaScript,但仍然失敗。有誰知道我能做些什麼來解決這個問題?

我看到這個similar question但沒有答案。

+0

您是否將裝飾器應用於要重定向到的頁面的處理程序? – mikerobi 2010-03-05 18:55:38

+0

它不適用於目標頁面。目標頁面應來自由Facebook生成的頁面get_xxx_url()調用。 – 2010-03-08 14:31:10

回答

2

我今天剛剛遇到同樣的事情!我認爲發生的事情是fbapi.check_session()沒有正確設置fbapi.added。我認爲Post-Add URL不再包含'installed',但仍然有'fb_sig_added'。 pyfacebook中的以下更改(github-esque代碼)爲我停止了無限重定向:

 
1244 | 1244 |  if request.method == 'POST': 
1245 | 1245 |   params = self.validate_signature(request.POST) 
1246 | 1246 |  else: 
1247 |  | -  if 'installed' in request.GET: 
    | 1247 | +  if 'installed' in request.GET or request.GET['fb_sig_added'] == '1': 
1248 | 1248 |    self.added = True 
+0

感謝Fraser的小費。這個問題困擾着我最長的時間,直到我終於讓步並切換到minifb(實際上gminifb http://blog.patrickcrosby.com/2008/04/20/Write-Facebook-apps-using-Google-AppEngine.html )通過pyfacebook。我發現它更容易 – 2010-03-18 13:41:12