Использование gmail api в django

Я немного новичок в Django, и мне нужна помощь в переводе моего скрипта python (аутентификация, создание службы gmail, запрос gmail) в приложение django. Я пытаюсь использовать образцы google django и классы, которые они указали здесь https://developers.google.com/api-client-library/python/guide/django, но немного запутался. Любая помощь будет принята с благодарностью! Приведенный ниже код проводит меня через поток аутентификации, когда я захожу в свой индекс, но затем после нажатия на мой профиль Google появляется страница с ошибкой: "ValueError at /app/ Невозможно назначить None: «CredentialsModel.id» не допускает нулевых значений».

Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
  112.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/sachinshukla/Desktop/gmail/customer_support/views.py" in index
  70.       credentials = run(flow, storage, http=http)
File "/Library/Python/2.7/site-packages/oauth2client/util.py" in positional_wrapper
  132.       return wrapped(*args, **kwargs)
File "/Library/Python/2.7/site-packages/oauth2client/old_run.py" in run
  156.   storage.put(credential)
File "/Library/Python/2.7/site-packages/oauth2client/client.py" in put
  325.       self.locked_put(credentials)
File "/Library/Python/2.7/site-packages/oauth2client/django_orm.py" in locked_put
  126.     entity = self.model_class(**args)
File "/Library/Python/2.7/site-packages/django/db/models/base.py" in __init__
  405.                 setattr(self, field.name, rel_obj)
File "/Library/Python/2.7/site-packages/django/db/models/fields/related.py" in __set__
  335.                                 (instance._meta.object_name, self.field.name))

Exception Type: ValueError at /customer_support/
Exception Value: Cannot assign None: "CredentialsModel.id" does not allow null values.

Код для просмотра:

CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), '..', 'client_secret.json')
REDIRECT_URI = 'http://localhost:8080/'
SCOPES = [
'https://www.googleapis.com/auth/gmail.modify',
]


def index(request):
    storage = Storage(CredentialsModel, 'id', request.user.id, 'credential')
    credentials = storage.get()

    flow = flow_from_clientsecrets(CLIENT_SECRETS, scope=SCOPES)
    http = httplib2.Http()

    if credentials is None or credentials.invalid:
        credentials = run(flow, storage, http=http)

    # Authorize the httplib2.Http object with our credentials
    http = credentials.authorize(http)

    # Build the Gmail service from discovery
    gmail_service = build('gmail', 'v1', http=http)

    # then do something, query threads, messages, etc, 
    and return them to a template - not sure where exactly to put the methods for querying     threads, messages, etc.

Модель:

from django.db import models

import pickle
import base64

from django.contrib import admin
from django.contrib.auth.models import User
from django.db import models

from oauth2client.django_orm import FlowField
from oauth2client.django_orm import CredentialsField


class CredentialsModel(models.Model):
  id = models.ForeignKey(User, primary_key=True)
  credential = CredentialsField()


class CredentialsAdmin(admin.ModelAdmin):
  pass


admin.site.register(CredentialsModel, CredentialsAdmin)

person sacshu    schedule 20.07.2014    source источник


Ответы (1)


1) Эта часть совершенно проблематична:

class CredentialsModel(models.Model):
  id = models.ForeignKey(User, primary_key=True)
  credential = CredentialsField()

Если вы хотите отношения 1-1 с моделью пользователя, вы можете использовать

user = models.OneToOneField(User, primary_key=True)

2) вы должны выделить эту часть в новый файл admin.py, чтобы избежать проблем в будущем.

class CredentialsAdmin(admin.ModelAdmin):
  pass


admin.site.register(CredentialsModel, CredentialsAdmin)

https://docs.djangoproject.com/en/1.6/topics/db/examples/one_to_one/

3) Проблема исходит отсюда:

storage = Storage(CredentialsModel, 'id', request.user.id, 'credential')

user_id != пользователь.

Правильный:

storage = Storage(CredentialsModel, 'id', request.user, 'credential')
person obayhan    schedule 20.07.2014
comment
Спасибо - мне пришлось изменить «id» в хранилище на «user», но похоже, что это сработало. - person sacshu; 21.07.2014