2016-06-10 75 views
5

是否有完整的基于Django的Google日历集成示例?我正在阅读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

非常感谢!现在,谷歌默认使用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 = ,范围= SCOPES)' –