2010-03-13 10 views
1

J'essaie d'obtenir une page de canevas FBML pour inviter automatiquement les nouveaux utilisateurs de l'application à obtenir la permission de publish_stream. Suite Facebook's documentation j'ai essayé d'utiliser l'argument required_permissions à require_login. C'est, j'ai essayé d'utiliser le décorateur pyfacebook de require_login comme ceci:Nécessite des autorisations étendues dans l'application FBML pyfacebook

@facebook.require_login(required_permissions='publish_stream') 

comme dans:

@decorator_from_middleware(FacebookMiddleware) 
@facebook.require_login(required_permissions='publish_stream') 
def canvas(request, template): 
    ... 

Demande autorisations étendues dans un iFrame Facebook basé pyfacebook-app has been discussed. Demande de autorisations étendues dans une application FBML too. Mon objectif est de besoin autorisations étendues dans une application FBML. Ai-je manqué quelque chose ou quelqu'un peut-il suggérer une solution de contournement?

Merci.

Répondre

2

droit, pyfacebook ne (, réorienter ou plutôt) ne supporte pas encore required_permissions pour login, mais vous pouvez appeler authorize manuellement. Je viens d'écrire le décorateur suivant pour mes besoins:

def require_permissions(*names): 
    """Require extended permissions. 
    XXX: in theory, the facebook.require_login() decorator should support 
    this, but doesn't in pyfacebook yet.""" 
    def decorator(fn): 
     required_perms = set(names) 
     def wrapper(request, *args, **kwargs): 
      fb = request.facebook 
      perms = set() if fb.ext_perms is None \ 
        else set(fb.ext_perms.split(',')) 
      if not required_perms.issubset(perms): 
       missing = required_perms.difference(perms) 
       url = fb.get_ext_perm_url(','.join(missing), 
          next='%s%s' % (fb.get_app_url(), request.path[1:])) 
       print url 
       return fb.redirect(url) 
      return fn(request, *args, **kwargs) 
     return wrapper 
    return decorator 

Vous devrez peut-être modifier la valeur de next comme il est passé à get_ext_perm_url, mais cela ne devrait par ailleurs être bien (fonctionne pour moi). Exemple d'utilisation:

@facebook.require_login() 
@facebook.require_add() 
@require_permissions('email', 'offline_access') 
def index(request): 
    # ... 
+1

Fonctionne comme un charme. Bonne solution admp. Comme vous l'avez suggéré, j'ai dû ajuster la valeur pour la prochaine. fb.get_app_url() renvoyait une URL avec "None", peut-être parce que fb.app_name n'était pas défini. Je suis allé avec next = '% s'% (FACEBOOK_APP_URL) et j'ai défini ce paramètre var moi-même. – jlpp

+1

Si je me souviens bien, j'ai dû définir 'FACEBOOK_APP_NAME' dans mes paramètres, pour que' get_app_url' fonctionne. – adomas

+1

Bon conseil. Merci encore. – jlpp