タイトルの通り。
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 の場合の書き方?
で、さらに色々調べてみて
django フレームワークを使った場合の認証まわりの書き方として見つかったのがこちら。
が、どうやらこの django_orm を利用した書き方は django-nonrel を使っていないとだめらしい。
(試してないが、django-nonrel を使っていれば こちら の公式のサンプルが動くはずです)
というのも、まず settings.py
に DATABASE
を指定しないと
settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', 'NAME': 'mydatabase', 'USER': 'root', 'PASSWORD': 'root', } }
こんな感じで ImproperlyConfigured
と怒られ
ENGINE
を django.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
現在
結局、このあたりの記事を見て試行錯誤してるところ。
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.