app-engine-patch и pyFacebook не работают
-
19-09-2019 - |
Вопрос
Я пытаюсь написать приложение для Facebook, используя app-engine-patch и pyFacebook.Я не использую ничего, кроме примеров, прилагаемых к каждому инструменту, и по какой-то причине это не сработает.
Я объединил их так же, как описано в принятом ответе здесь:Facebook, Django и Google App Engine
app-engine-patch, кажется, работает нормально, но когда я пытаюсь использовать @facebook.require_login(), я получаю это из журналов GAE:
Exception in request:
Traceback (most recent call last):
File "/base/data/home/apps/app-name/1.339079629847560090/common/zip-packages/django-1.1.zip/django/core/handlers/base.py", line 92, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/base/data/home/apps/app-name/1.339079629847560090/facebook/djangofb/__init__.py", line 87, in newview
if not fb.check_session(request):
File "/base/data/home/apps/app-name/1.339079629847560090/facebook/__init__.py", line 1293, in check_session
self.session_key_expires = int(params['expires'])
ValueError: invalid literal for int() with base 10: 'None'
Это происходит независимо от того, какое представление я украшаю с помощью @facebook.require_login().
Я использую последние версии обоих проектов и понятия не имею, почему это не работает.
Большое спасибо за ваше время.
ОБНОВЛЯТЬ: Я сделал быстрое исправление для pyFacebook, но просто забыл вернуть его в ветку.
Теперь еще и в качестве ответа, поскольку это, похоже, единственный выход.
Если вы измените строку facebook/__init__.py 1292+ на эту:
if params.get('expires'):
self.session_key_expires = int(params['expires'])
К этому:
if params.get('expires'):
if params['expires'] == 'None':
params['expires'] = 0
self.session_key_expires = int(params['expires'])
Это будет работать, но это хак, и, возможно, это можно было бы сделать более элегантно, но это работает.Надо указать разработчикам pyFacebook на эту ветку, может быть, у них найдется лучшее решение.
Решение 2
Если вы измените строку facebook/__init__.py 1292+ на эту:
if params.get('expires'):
self.session_key_expires = int(params['expires'])
К этому:
if params.get('expires'):
if params['expires'] == 'None':
params['expires'] = 0
self.session_key_expires = int(params['expires'])
Это будет работать, но это хак, и, возможно, это можно было бы сделать более элегантно, но это работает.
Другие советы
Вам не следует использовать декоратор pyfacebook. @facebook.require_login()
при использовании pyfacebook с facebook-connect.Декоратор предназначен для использования в приложении Facebook, поскольку он перенаправляет пользователя на сайт Facebook, если он не вошел в систему, но вы действительно хотите перенаправить пользователя на страницу входа на свой сайт, если он не вошел в систему.
Чтобы проверить, вошел ли кто-то в систему с помощью facebook-connect и pyfacebook с промежуточным программным обеспечением djangofb, вы вызываете request.fb.check_session(request)
.Если check_session
возвращает True, то у них есть действительный сеанс.Если он возвращает False, вам необходимо перенаправить пользователя на вашу страницу входа, чтобы он мог нажать кнопку входа в Facebook Connect, которую вы (должны) разместить на этой странице.