2016-06-10 7 views
5

Gibt es ein vollwertiges Django-basiertes Beispiel einer Google Kalender-Integration? Ich habe gelesen Google's example page, aber ihre Verbindung an der Unterseite ist veraltet.Google Kalender-Integration mit Django

Ich bin speziell mit den Aktualisierungs-Token struggeling als Googles Beispiele allein darauf konzentrieren, wie die Zugriffstoken zu erhalten. Das ist, was ich bisher:

@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() 

Antwort

6

viele verschiedene Ansätze Researching fand ich heraus, dass die Server-zu-Server-Authentifizierung ist das, was ich wollte. Auf diese Weise muss kein Benutzer explizit Berechtigungen erteilen und erworbene Auth-Token müssen nicht erneuert werden. Stattdessen kann ein Server mit einem Dienstkonto selbst Anrufe tätigen.

Bevor Sie Codierung beginnen können, müssen Sie für das Einrichten eines solchen Dienstkonto und fügen Sie es Ihrem Kalender, den Sie das Dienstkonto zugreifen soll. Google hat die drei Schritte zum Erstellen eines Kontos here notiert. Danach gehen Sie zu https://calendar.google.com, suchen Sie auf der linken Seite des Bildschirms den Kalender, den Sie mit Ihrem neuen Dienstkonto teilen möchten, und klicken Sie auf das Dreieck neben ihm. Wählen Sie im Drop-down-Menü die Kalendereinstellungen aus. Sie gelangen auf einen Bildschirm, auf dem Sie den Kalender-ID finden, die Sie später brauchen werden (so aufschreiben) und zeigt auch eine Registerkarte am oberen Zugriff auf den Kalender zu teilen. Als "Person" geben Sie die E-Mail-Adresse aus dem Dienstkonto ein, geben Sie ihr die entsprechenden Berechtigungen und klicken Sie auf Speichern (wenn Sie nicht auf Speichern klicken, wird das Dienstkonto nicht hinzugefügt).

Der Code dafür ist eigentlich ziemlich elegant:

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) 

Ich verwende oauth2client Version 2.2.0 (pip install oauth2client). Ich hoffe diese Antwort hilft :)

+0

Vielen Dank! Heutzutage verwendet Google das JSON-Schlüsselformat als Standard, so dass Ihr Code von 'credentials = ServiceAccountCredentials.from_p12_keyfile (service_account_email = service_account_email, filename = CLIENT_SECRET_FILE, scopes = SCOPES)' zu 'credentials = ServiceAccountCredentials.from_json_keyfile_name (filename = , scopes = SCOPES) ' –