#python #django #google-app-engine #facebook-graph-api #facebook
#python #django #google-app-engine #facebook-graph-api #Facebook
Вопрос:
Я попытался сделать пользовательскую переменную доступной на сервере, и теперь я заметил, что моя страница ведет себя так, как я хочу, если я перезагружаю:
Итак, как я могу заставить страницу перезагрузиться при подключении / отключении Facebook? Есть еще идеи по поводу этого кода? Я попробовал очевидный javascript, но это создало цикл. Вы можете мне помочь? Спасибо
{% load i18n %}
<!DOCTYPE html>
<html xmlns:fb="https://www.facebook.com/2008/fbml">
<head>
<title>
Test Facebook SDK
</title>
</head>
<body>
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1amp;appId=164355773607006";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script><div class="fb-login-button" autologoutlink="true" data-show-faces="true" data-width="200" data-max-rows="1"></div>
{% if greeting or user or current_user or twittername %}
<div id="user-ident">
<span>{% trans "Welcome," %} <b>{{user.nickname}}{% if not user %}{{ current_user.name|escape }}{% endif %}{% if not user and not current_user %}{{ twittername }}{% endif %}</b></span>
</div>
<fb:login-button autologoutlink="true">Logout</fb:login-button>
{% else %}
<fb:login-button autologoutlink="true">Login with Facebook</fb:login-button>{% endif %}
</body>
</html>
Обновить
Я удалил все Javascript и файлы cookie, поскольку они не нужны, и создал чистое решение на python с OAuth 2.0, чтобы включить мой сценарий «вход в систему с помощью facebook»:
Как добавить Facebook в качестве поставщика OAuth 2.0: Вот как я делаю «Вход с помощью facebook» для своего веб-сайта с помощью OAuth вместо javascript / cookie это python только для OAuth 2.0 с Facebook, и, насколько я могу судить, он работает:
class FBUser(db.Model):
id = db.StringProperty(required=True)
created = db.DateTimeProperty(auto_now_add=True)
updated = db.DateTimeProperty(auto_now=True)
name = db.StringProperty(required=True)
profile_url = db.StringProperty()
access_token = db.StringProperty(required=True)
name = db.StringProperty(required=True)
picture = db.StringProperty()
email = db.StringProperty()
friends = db.StringListProperty()
class I18NPage(I18NHandler):
def get(self):
if self.request.get('code'):
args = dict(
code = self.request.get('code'),
client_id = facebookconf.FACEBOOK_APP_ID,
client_secret = facebookconf.FACEBOOK_APP_SECRET,
redirect_uri = 'http://www.koolbusiness.com/',
)
logging.debug("client_id" str(args))
file = urllib.urlopen("https://graph.facebook.com/oauth/access_token?" urllib.urlencode(args))
try:
logging.debug("reading file")
token_response = file.read()
logging.debug("read file" str(token_response))
finally:
file.close()
access_token = cgi.parse_qs(token_response)["access_token"][-1]
graph = main.GraphAPI(access_token)
user = graph.get_object("me") #write the access_token to the datastore
fbuser = main.FBUser.get_by_key_name(user["id"])
logging.debug("fbuser " str(fbuser))
if not fbuser:
fbuser = main.FBUser(key_name=str(user["id"]),
id=str(user["id"]),
name=user["name"],
profile_url=user["link"],
access_token=access_token)
fbuser.put()
elif fbuser.access_token != access_token:
fbuser.access_token = access_token
fbuser.put()
Ссылка для входа
<a href="https://www.facebook.com/dialog/oauth?client_id=164355773607006amp;redirect_uri=http://{{host}}/"><img src="/_/img/loginwithfacebook.png"></a>
это перенаправляет и позволяет мне выбрать access_token в приведенном выше методе, и выход из системы прост:
<a href="https://www.facebook.com/logout.php?next=http://www.koolbusiness.comamp;access_token={{access_token}}">{% trans "Log out" %}</a>
Ответ №1:
Если содержимое вашей страницы зависит от событий, которые происходят после загрузки страницы (т. Е. Входа / выхода из Facebook), лучшим выбором может быть использование jQuery ajax для загрузки и / или перезагрузки зависимых элементов отдельно.