Aplikacje facebookowe z fandjango i facepy

Jak prosto tworzyć za pomocją django, facepy i fandjango aplikacje facebookowe

Pomysłów na Django + Facebook jest wiele. Pośród nich mamy facepy (dokumentacja) do obsługi Graph API i fandjango (dokumentacja) do tworzenia aplikacji facebookowych wykorzystujące facepy oraz oferujące mechanizm autoryzacji użytkowników w aplikacji. W tym artykule zaprezentuję te dwie biblioteki (na przykładzie aplikacji wykorzystującej fandjango).

Instalacja jest prosta:
pip install fandjango

Następnie dodajemy fandjango do INSTALLED_APPS naszego projektu, do MIDDLEWARE_CLASSES dodajemy fandjango.middleware.FacebookMiddleware (przed CsrfViewMiddleware). Do reguł w urls.py dodajemy url(r'^fandjango/', include('fandjango.urls')). W TEMPLATE_LOADERS konieczne może okazać się dodanie "django.template.loaders.eggs.Loader".

Musimy także podać dane aplikacji Facebookowej, pod którą dostępna będzie nasza aplikacja (o aplikacjach za chwilę):
FACEBOOK_APPLICATION_ID = '...'
FACEBOOK_APPLICATION_SECRET_KEY = '...'
FACEBOOK_APPLICATION_NAMESPACE = '...'
Na koniec wykonujemy python manage.py syncdb (lub migrację z South jeżeli używamy). fandjango jest gotowe do użycia. Można podać opcjonalne parametry w settings.py.

Aplikacje Facebooka

Aplikacje na facebooku tworzymy na developers.facebook.com/apps. Podajemy nazwę i aplikacja zostanie stworzona. Tworząc aplikację dostępną wewnątrz Facebooka musimy ją skonfigurować. Wybieramy App on Facebook i podajemy "Canvas URL" oraz "Secure Canvas URL" - czyli link URL do strony (z projektu Django) jaka ma się pojawić na głównej stronie aplikacji na Facebooku. Wersja "secure" przeznaczona jest dla linków szyfrowanych (https). Musimy także podać "App Namespace" czyli unikalny "identyfikator" używany m.in. przez API. Po zapisaniu ustawień kopiujemy "App ID", "App Secret" i "App Namespace" do settings.py.

Pod adresem https://apps.facebook.com/NAMESPACE_TUTAJ/ dostępna będzie nasza aplikacja. Gdy wrzucimy na serwer i skonfigurujemy projekt Django powinniśmy zobaczyć widok podpięty pod adres URL podany w "Canvas URL".

Aplikacja Django+Fandjango

W najprostszym przypadku widok django zwraca jakiś kod HTML. Wyświetli się to w ramce lub jako FBML na facebooku (określasz to w ustawieniach aplikacji na FB). W odróżnieniu od zwykłej strony www szablon jest prostszy i musi wpasować się w wymiary ramki facebooka.

Fandjango daje dekorator facebook_authorization_required. Widok oznaczony takim dekoratorem poprosi użytkownika Facebooka o autoryzację (zezwolenie aplikacji FB na dostęp do części jego konta). By np. uzyskać dostęp do podstawowych danych jak ID użytkownika, czy np. do dodawania postów na tablicy użytkownika musimy poprosić o taką autoryzację. Po autoryzacji w widokach będziemy mogli korzystać z obiektu request.facebook.user zawierającego podstawowe dane użytkownika, a także obiekt facepy do wykonywania operacji na Graph API. Oto przykłady:

# -*- coding: utf-8 -*-
#!/usr/bin/python
from django.shortcuts import render_to_response
from django.conf import settings
from django.template import RequestContext
from django.http import HttpResponseRedirect,HttpResponse
from django.core.urlresolvers import reverse
from django.contrib import messages

from fandjango.decorators import facebook_authorization_required


def show_index(request):
    """
    Show the main page
    """
    # check if user is FB-authenticated 
    if request.facebook:
        request.facebook.user.synchronize()
        fb_user = request.facebook.user
    else:
        fb_user = False
    
    return render_to_response(
        'fbdemo/show_index.html',
        {'fb_user': fb_user},
        context_instance=RequestContext(request))

@facebook_authorization_required
def authenticate_user(request):
    """
    Ask user to authorize the app so that show_index gets the user data
    """
    return HttpResponseRedirect(reverse('fbdemo.views.show_index'))

@facebook_authorization_required
def show_my_posts(request):
    """
    Using graph api example
    """
    if request.facebook:
        fb_user = request.facebook.user
        posts = fb_user.graph.get('me/posts')
    else:
        return HttpResponseRedirect(reverse('fbdemo.views.show_index'))
        
    return render_to_response(
        'fbdemo/show_my_posts.html',
        {'posts': posts},
        context_instance=RequestContext(request))
    
@facebook_authorization_required
def make_a_post(request):
    """
    Using graph api example 2
    """
    if request.facebook:
        fb_user = request.facebook.user
        fb_user.graph.post('me/feed', message=u'Testuję fandjango :)')
        messages.success(request, 'Post stworzony')
    else:
        messages.error(request, 'Brak request.facebook')
    
    return HttpResponseRedirect(reverse('fbdemo.views.show_index'))
Mamy kilka widoków. show_index wyświetla się jako główny. Jeżeli użytkownik zezwolił aplikacji na dostęp do jego danych to będzie dostępny request.facebook.user - w szablonie wyświetlone zostaną podstawowe dane:
<h1>FBDemo</h1>
    {% if fb_user %}
        {{ fb_user|pprint }}<br />
        
        <b>authorized</b>: {{ fb_user.authorized }}<br />
        <b>facebook_id</b>: {{ fb_user.facebook_id }}<br />
        <b>facebook_username</b>: {{ fb_user.facebook_username }}<br />
        <b>full_name</b>: {{ fb_user.full_name }}<br />
        <b>oauth_token</b>: {{ fb_user.oauth_token }}<br />
        <b>picture</b>: {{ fb_user.picture }}<br />
        <b>graph</b>: {{ fb_user.graph }}<br />
        
        <ul>
            <li><a href="{% url fbdemo.views.show_my_posts %}">Pokaż moje posty z walla</a></li>
            <li><a href="{% url fbdemo.views.make_a_post %}">Dodaj testowy wpis na walla</a></li>
        </ul>
        
    {% else %}
        Nie jesteś zalogowany jako użytkownik FB, <a href="{% url fbdemo.views.authenticate_user %}">zaloguj się</a>.
    {% endif %}

Widok authenticate_user to prosty widok, który nie robi nic prócz prośbą o autoryzację aplikacji. Gdy użytkownik to zrobi pozostałe widoki będą już miały dostęp i po prostu się wykonają bez kolejnego pytania o autoryzację.

Pytanie użytkownika o autoryzację aplikacji FB

Widok show_my_posts pokazuje wykorzystanie Graph API Facebooka do zarządzania (np. pobierania) danymi z FB. request.facebook.user.graph to instancja facepy więc metoda "get" pobierze żądany element. Widok make_a_post dodaje post na tablicy użytkownika. Obie operacje powiodą się tylko jeżeli użytkownik wcześniej zezwolił na takie operacje - read_stream i publish_stream. Ja użyłem:

FACEBOOK_APPLICATION_INITIAL_PERMISSIONS = ['user_activities', 'email', 'read_stream', 'publish_stream']
Same żądania takie jak me/posts opisane są w dokumentacji Graph API Facebooka.
Post na tablicy użytkownika dodany przez aplikację FB
blog comments powered by Disqus

Kategorie

Strony