2016-06-10 2 views
5

Google 캘린더 통합의 Django 기반 완전 본격적인 예가 있습니까? Google's example page을 통해 읽었지만 하단의 링크가 오래된 것입니다.Google 캘린더와 Django의 통합

나는 Google의 예가 액세스 토큰을 얻는 방법에만 초점을 맞추기 때문에 특별히 새로 고침 토큰을 사용하는 데 어려움을 겪고 있습니다.

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

답변

6

내가 그 서버 간 인증을 발견 서로 다른 접근 방식을 많이 내가 원하는 무엇인가를 검토 한 결과 : 그건 내가 지금까지 무엇을합니다. 이렇게하면 사용자가 명시 적으로 사용 권한을 부여 할 필요가 없으며 획득 한 인증 토큰을 갱신 할 필요가 없습니다. 대신 서버는 서비스 계정을 사용하여 자체적으로 전화를 걸 수 있습니다.

코딩을 시작하려면 먼저 서비스 계정을 설정하고 서비스 계정에 액세스하려는 달력에 추가해야합니다. Google은 계정을 생성하기위한 세 단계를 기록했습니다 here. 그런 다음 https://calendar.google.com으로 이동하여 화면 왼쪽에서 새 서비스 계정과 공유하려는 캘린더를 찾아 옆에있는 삼각형을 클릭하십시오. 드롭 다운 메뉴에서 캘린더 설정을 선택하십시오. 그러면 나중에 필요할 캘린더 ID를 찾을 수있는 화면으로 이동하고 상단에 캘린더에 대한 액세스 권한을 공유 할 수있는 탭을 표시합니다. "사람"이 서비스 계정의 전자 메일 주소를 삽입 할 때 해당 사용 권한을 부여하고 을 클릭하여 저장을 클릭합니다 (저장하지 않을 경우 서비스 계정을 추가하지 않음).

이 코드는 실제로 매우 우아한 :

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) 

내가 oauth2client 버전 2.2.0 (pip install oauth2client)를 사용하고 있습니다.

이 답변으로 도움이되기를 바랍니다. :)

+0

대단히 고마워요! 요즘 Google은 JSON 키 형식을 기본값으로 사용하므로 'credentials = ServiceAccountCredentials.from_p12_keyfile (service_account_email = service_account_email, filename = CLIENT_SECRET_FILE, scopes = SCOPES)'에서 'credentials = ServiceAccountCredentials.from_json_keyfile_name (filename = < JSON 형식으로 키의 파일 이름>, scopes = SCOPES)' –