Python 使用PyFacebook和Google应用程序引擎循环重定向

Python 使用PyFacebook和Google应用程序引擎循环重定向,python,google-app-engine,redirect,pyfacebook,Python,Google App Engine,Redirect,Pyfacebook,我在GoogleAppEngine上托管了一个Python Facebook项目,并使用以下代码使用PyFacebook处理Facebook API的初始化 # Facebook Initialization def initialize_facebook(f): # Redirection handler def redirect(self, url): logger.info('Redirecting the user to: ' + url)

我在GoogleAppEngine上托管了一个Python Facebook项目,并使用以下代码使用PyFacebook处理Facebook API的初始化

# 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)
#Facebook初始化
def初始化(f):
#重定向处理程序
def重定向(自我,url):
logger.info('将用户重定向到:'+url)
self.response.headers.add_头(“缓存控制”,“最大年龄=0”)
self.response.headers.add_头(“Pragma”,“无缓存”)
self.response.out.write('parent.location.replace(\''+url+'\'');'))
返回“暂时移动”
auth_token=request.params.get('auth_token',无)
fbapi=Facebook(设置['Facebook\U API\U KEY'],设置['Facebook\U SECRET\U KEY'],身份验证令牌=auth\U令牌)
如果不是fbapi:
logger.error('Facebook未能初始化')
如果fbapi.check_会话(请求)或auth_令牌:
通过
其他:
logger.info('用户未登录Facebook')
返回lambda:redirect(a,fbapi.get\u login\u url())
如果添加了fbapi.1:
通过
其他:
logger.info('用户没有'+设置['FACEBOOK\u APP\u NAME']+'添加')
返回lambda:redirect(a,fbapi.get\u add\u url())
#返回已验证的API
logger.info('Facebook已成功初始化')
返回lambda:f(a,fbapi=fbapi)
我正在尝试设置它,以便我可以在任何页面处理程序方法上删除此装饰程序,并验证用户是否正确设置了所有内容。问题是,当调用重定向处理程序时,它会启动一个无限的重定向循环

我尝试使用HTTP302重定向来代替JavaScript,但还是失败了。有人知道我能做些什么来解决这个问题吗


我看到了,但没有答案。

这个问题似乎很熟悉。 您可以使用我这里的问题的解决方案:


但这是pyfacebook附带的装饰程序,所以可能会有所不同。

我今天也遇到了同样的事情!我认为发生的是fbapi.check_session()未正确设置fbapi.added。我认为不再包含“已安装”,但仍然添加了“fb_sig_”。pyfacebook中的以下更改(github类代码)为我停止了无限重定向:

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 1244 | 1244 | if request.method==“POST”: 1245 | 1245 | params=self.validate_签名(request.POST) 1246 | 1246 |其他: 1247 | |-如果在request.GET中“安装”: |1247 |+如果在request.GET或request.GET中“已安装”['fb_sig_added']='1': 1248 1248 | self.added=真
您是否将装饰程序应用于要重定向到的页面的处理程序?它不应该应用于目标页面。目标页面应该来自get_xxx_url()调用,这些调用是Facebook生成的页面。感谢Fraser提供的提示。这个问题困扰了我很长一段时间,直到我最终屈服,通过pyfacebook切换到minifb(实际上是gminifb)。我觉得比较容易