読者です 読者をやめる 読者になる 読者になる

dackdive's blog

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

follow us in feedly

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

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

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

はじめに

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

Getting Started with Google Tasks API on Google App Engine - Google App Engine — Google Cloud Platform

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 フレームワークを使った場合の認証まわりの書き方として見つかったのがこちら。

Using Django - Google APIs Client Library for Python — Google Developers

が、どうやらこの 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

現在

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

Using Google App Engine - Google APIs Client Library for Python — Google Developers

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
Running Pure Django Projects on Google App Engine - Google App Engine — Google Cloud Platform

python client を django で使うためのモデル定義の見本(公式) → models.model なので使わない
Using Django - Google APIs Client Library for Python — Google Developers

公式
Using Google App Engine - Google APIs Client Library for Python — Google Developers