2016-06-10 53 views
5

Esiste un esempio basato su Django completo di un'integrazione di Google Calendar? Stavo leggendo attraverso Google's example page ma il loro link in fondo è obsoleto.Integrazione di Google Calendar con Django

Sono in particolare con il token di aggiornamento mentre gli esempi di Google si concentrano esclusivamente su come ottenere il token di accesso. Questo è quello che ho finora:

@staff_member_required 
def authorize_access(request): 
    return redirect(get_flow(request).step1_get_authorize_url()) 

@staff_member_required 
def oauth2_callback(request): 
    credentials = get_flow(request).step2_exchange(request.GET['code']) 

    store = get_store() 
    store.put(credentials) 
    credentials.set_store(store) 

    return redirect('...') 

def get_flow(request): 
    flow = client.flow_from_clientsecrets(os.path.join(CREDENTIAL_DIR, CLIENT_SECRET_FILE), 
             SCOPES, 
             redirect_uri='%s://%s/google-calendar/oauth2-callback/' % (request.META['wsgi.url_scheme'], request.META['HTTP_HOST'],)) 
    flow.params['access_type'] = 'offline' 
    flow.params['approval_prompt'] = 'force' 

    return flow 

def get_store(): 
    return oauth2client.file.Storage(os.path.join(CREDENTIAL_DIR, ACCESS_TOKEN_FILE)) 

def has_valid_api_credentials(): 
    credentials = get_store().get() 
    return credentials is not None 

def build_service(): 
    credentials = get_store().get() 

    if not credentials: 
     return None 
    elif credentials.access_token_expired: 
     http = credentials.refresh(httplib2.Http()) 
     http = get_store().get().authorize(http) 
    else: 
     http = credentials.authorize(httplib2.Http()) 

    service = discovery.build('calendar', 'v3', http=http) 

    return service 

def create_events(rental_request): 
    service = build_service() 

    event = service.events().insert(...).execute() 

risposta

6

ricerca di un sacco di diversi approcci ho scoperto che l'autenticazione del server-to-server è quello che volevo. In questo modo nessun utente deve dare esplicitamente permessi e i token di autenticazione acquisiti non devono essere rinnovati. Invece, utilizzando un account di servizio, un server può effettuare chiamate da solo.

Prima di iniziare la codifica, è necessario configurare tale account di servizio e aggiungerlo al calendario a cui si desidera accedere all'account del servizio. Google ha annotato i tre passaggi per creare un account here. Successivamente, vai a https://calendar.google.com, individua nella parte sinistra dello schermo il calendario che desideri condividere con il tuo nuovo account di servizio e fai clic sul triangolo accanto. Dal menu a discesa scegliere le impostazioni del calendario. Questo ti porta a una schermata in cui troverai l'ID del calendario che ti servirà in seguito (quindi annotalo) e visualizzerai anche una scheda in alto per condividere l'accesso al calendario. Come "persona" inserisci l'indirizzo email dall'account del servizio, dagli le rispettive autorizzazioni e fai clic su Salva (se non fai clic su Salva l'account del servizio non verrà aggiunto).

Il codice per questo è in realtà piuttosto elegante:

import os 
from datetime import timedelta 
import datetime 
import pytz 

import httplib2 
from googleapiclient.discovery import build 
from oauth2client.service_account import ServiceAccountCredentials 

service_account_email = '[email protected]' 

CLIENT_SECRET_FILE = 'creds.p12' 

SCOPES = 'https://www.googleapis.com/auth/calendar' 
scopes = [SCOPES] 

def build_service(): 
    credentials = ServiceAccountCredentials.from_p12_keyfile(
     service_account_email=service_account_email, 
     filename=CLIENT_SECRET_FILE, 
     scopes=SCOPES 
    ) 

    http = credentials.authorize(httplib2.Http()) 

    service = build('calendar', 'v3', http=http) 

    return service 


def create_event(): 
    service = build_service() 

    start_datetime = datetime.datetime.now(tz=pytz.utc) 
    event = service.events().insert(calendarId='<YOUR EMAIL HERE>@gmail.com', body={ 
     'summary': 'Foo', 
     'description': 'Bar', 
     'start': {'dateTime': start_datetime.isoformat()}, 
     'end': {'dateTime': (start_datetime + timedelta(minutes=15)).isoformat()}, 
    }).execute() 

    print(event) 

sto usando oauth2client versione 2.2.0 (pip install oauth2client).

Spero che questa risposta aiuta :)

+0

Grazie mille! Al giorno d'oggi, google utilizza il formato chiave JSON come predefinito, quindi il tuo codice può essere adattato da 'credentials = ServiceAccountCredentials.from_p12_keyfile (service_account_email = service_account_email, filename = CLIENT_SECRET_FILE, ambiti = SCOPES)' a 'credenziali = ServiceAccountCredentials.from_json_keyfile_name (filename = , ambiti = SCOPI) ' –