dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

[GAE][django]Google APIs Client Library for Pythonをdjangoで使う (1)

タイトルの通り。
Google App Engine で Tasks API を利用した簡単なアプリを作ろうとしたがOAuth2 の認証でハマってしまい、
現在も解決していないが調査記録をメモ。

最終的に解決したら別の記事として整理したい。

はじめに

やろうとしたのはこの記事にあるアプリ。

Python Quickstart  |  Tasks API  |  Google Developers

import webapp2

from apiclient.discovery import build
from oauth2client.appengine import OAuth2Decorator

import settings

decorator = OAuth2Decorator(client_id=settings.CLIENT_ID,
                            client_secret=settings.CLIENT_SECRET,
                            scope=settings.SCOPE)
service = build('tasks', 'v1')

class MainHandler(webapp2.RequestHandler):

   @decorator.oauth_required
   def get(self):
     tasks = service.tasks().list(tasklist='@default').execute(
         http=decorator.http())
     self.response.write('<html><body><ul>')
     for task in tasks['items']:
       self.response.write('<li>%s</li>' % task['title'])
     self.response.write('</ul></body><html>')

application = webapp2.WSGIApplication([
    ('/', MainHandler),
    (decorator.callback_path, decorator.callback_handler()),
    ], debug=True)

これ、を以下のように django の View で書き換えた。

# -*- coding: utf-8 -*-
import settings

from apiclient.discovery import build
from oauth2client.appengine import OAuth2Decorator

from django.core.context_processors import csrf
from django.shortcuts import render
from django.views.generic.base import View


decorator = OAuth2Decorator(client_id=settings.CLIENT_ID,
                            client_secret=settings.CLIENT_SECRET,
                            scope=settings.SCOPE)
service = build('tasks', 'v1')


class MainView(View):
    template_name = 'task_manager/index.html'

    @decorator.oauth_required
    def get(self, request):
        tasks = service.tasks().list(tasklist='@default').execute(
                http=decorator.http())
        template_values = {
                'app_name': request.resolver_match.app_name,
                'tasks': tasks,
                }
        template_values.update(csrf(request))
        return render(request, self.template_name, template_values)

すると、以下のようなエラーが。

'WSGIRequest' object has no attribute 'relative_url'

調べてみたところ OAuth2Decorator
webapp もしくは webapp2 フレームワークでしか使えないっぽい。

参考: django - AttributeError: 'WSGIRequest' object has no attribute 'request' on OAuth2Decorator - Stack Overflow

django の場合の書き方?

で、さらに色々調べてみて
django フレームワークを使った場合の認証まわりの書き方として見つかったのがこちら。

GitHub - googleapis/google-api-python-client: 🐍 The official Python client library for Google's discovery based APIs.

が、どうやらこの django_orm を利用した書き方は django-nonrel を使っていないとだめらしい。
(試してないが、django-nonrel を使っていれば こちら の公式のサンプルが動くはずです)

というのも、まず settings.pyDATABASE を指定しないと

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.',
        'NAME': 'mydatabase',
        'USER': 'root',
        'PASSWORD': 'root',
        }
    }

こんな感じで ImproperlyConfigured と怒られ

f:id:dackdive:20150125032345p:plain

ENGINEdjango.db.backends.sqlite3 とすると

ImproperlyConfigured: Error loading either pysqlite2 or sqlite3 modules (tried in that order): No module named _sqlite3

というエラーが表示され、このエラーで調べてみたところ
おそらく sqlite3 を指定するのは適切でなく、
純粋な django アプリケーション(モデルの定義に models.Model を使ってるようなもの?) は
django-nonrel というライブラリを入れないと使えないらしい。

参考: python - Using sqlite3 within Google App Engine? - Stack Overflow

現在

結局、このあたりの記事を見て試行錯誤してるところ。

GitHub - googleapis/google-api-python-client: 🐍 The official Python client library for Google's discovery based APIs.

Use the Google Analytics API with Django | Marina Mele's site

つづく。(2015/01/29追記) 書きました。
[GAE][django]Google APIs Client Library for Pythonをdjangoで使う (2) - dackdive's blog

リファレンス

django-nonrel
djangoappengine - Django App Engine backends (DB, email, etc.) | All Buttons Pressed

これもdjango-nonrel
Getting started with Django  |  Python  |  Google Cloud

python client を django で使うためのモデル定義の見本(公式) → models.model なので使わない
GitHub - googleapis/google-api-python-client: 🐍 The official Python client library for Google's discovery based APIs.

公式
GitHub - googleapis/google-api-python-client: 🐍 The official Python client library for Google's discovery based APIs.