2010-03-13 3 views
1

Я пытаюсь получить мою страницу холста FBML, чтобы автоматически запрашивать новых пользователей приложения для разрешения publish_stream. После Facebook's documentation Я попытался использовать аргумент required_permissions для require_login. То есть, я пытался использовать pyfacebook require_login декоратор, как это:Требовать расширенные разрешения в приложении FIFML pyfacebook

@facebook.require_login(required_permissions='publish_stream') 

как в:

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

запрашивающей расширенных прав доступа в виде pyfacebook на основе Facebook IFrame приложения has been discussed. Запрашивать расширенные разрешения в приложении FBML too. Моя цель - , требует расширенных разрешений в приложении FBML. Я что-то упускаю, или кто-нибудь может предложить обходное решение?

Спасибо.

ответ

2

Право, pyfacebook еще не поддерживает required_permissions для login, но вы можете позвонить (или, скорее, перенаправление) authorize вручную. Я только что написал следующее декоратора для моих целей:

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 

Вы, возможно, придется настроить значение next, как он передается get_ext_perm_url, но это должно быть хорошо в противном случае (работает для меня). Пример использования:

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

Работает как очарование. Отличное решение admp. Как вы предположили, мне пришлось подстроить значение для следующего. fb.get_app_url() возвращал URL-адрес с «None», возможно, потому, что имя fb.app_name не было установлено. Я пошел со следующим = '% s'% (FACEBOOK_APP_URL) и сам определил эту настройку var. – jlpp

+1

Если я правильно помню, мне нужно было определить 'FACEBOOK_APP_NAME' в моих настройках, чтобы получить' get_app_url' работу. – adomas

+1

Хороший совет. Еще раз спасибо. – jlpp

Смежные вопросы