2015-04-01 2 views
2

Я новичок в Python, а также в Flask ... Я разработал файл python, который устанавливает аутентификацию Oauth2 с помощью googele и выбирает список сообщений из GMAIL API. Вот мой кодPython/Flask google api интеграция

import json 
import flask 
import httplib2 
import base64 
import email 

from apiclient import discovery, errors 
from oauth2client import client 


app = flask.Flask(__name__) 


@app.route('/') 
def index(): 
    if 'credentials' not in flask.session: 
     return flask.redirect(flask.url_for('oauth2callback')) 
    credentials = client.OAuth2Credentials.from_json(flask.session['credentials']) 
    if credentials.access_token_expired: 
     return flask.redirect(flask.url_for('oauth2callback')) 
    else: 
     http_auth = credentials.authorize(httplib2.Http()) 
     gmail_service = discovery.build('gmail', 'v1', http_auth) 
     threads = gmail_service.users().threads().list(userId='me').execute() 
     return json.dumps(threads) 


@app.route('/oauth2callback') 
def oauth2callback(): 
    flow = client.flow_from_clientsecrets(
     'client_secrets.json', 
     scope='https://mail.google.com/', 
     redirect_uri=flask.url_for('oauth2callback', _external=True) 
    ) 
    if 'code' not in flask.request.args: 
     auth_uri = flow.step1_get_authorize_url() 
     return flask.redirect(auth_uri) 
    else: 
     auth_code = flask.request.args.get('code') 
     credentials = flow.step2_exchange(auth_code) 
     flask.session['credentials'] = credentials.to_json() 
     return flask.redirect(flask.url_for('index')) 

@app.route('/getmail') 
def getmail(): 
    if 'credentials' not in flask.session: 
     return flask.redirect(flask.url_for('oauth2callback')) 
    credentials = client.OAuth2Credentials.from_json(flask.session['credentials']) 
    if credentials.access_token_expired: 
     return flask.redirect(flask.url_for('oauth2callback')) 
    else: 
     http_auth = credentials.authorize(httplib2.Http()) 
     gmail_service = discovery.build('gmail', 'v1', http_auth) 
     query = 'is:inbox' 
     """List all Messages of the user's mailbox matching the query. 

     Args: 
     service: Authorized Gmail API service instance. 
     user_id: User's email address. The special value "me" 
     can be used to indicate the authenticated user. 
     query: String used to filter messages returned. 
     Eg.- 'from:[email protected]_domain.com' for Messages from a particular sender. 

     Returns: 
     List of Messages that match the criteria of the query. Note that the 
     returned list contains Message IDs, you must use get with the 
     appropriate ID to get the details of a Message. 
     """ 
     try: 
      response = gmail_service.users().messages().list(userId='me', q=query).execute() 
      messages = [] 
      if 'messages' in response: 
       print 'test %s' % response 
       messages.extend(response['messages']) 
      while 'nextPageToken' in response: 
       page_token = response['nextPageToken'] 
       response = gmail_service.users().messages().list(userId='me', q=query, pageToken=page_token).execute() 
       messages.extend(response['messages']) 

      return messages 
     except errors.HttpError, error: 
      print 'An error occurred: %s' % error 

if __name__ == '__main__': 
    import uuid 
    app.secret_key = str(uuid.uuid4()) 
    app.debug = True 
    app.run() 

Authentication работает отлично, и когда я иду в /getmail URL я получаю эту ошибку TypeError: 'list' object is not callable

Любые мысли, что я делаю не так?

+4

См [этот ответ] (http://stackoverflow.com/questions/27608987/typeerror-list-object-is -независимая колба), возможно, это помогает. – doru

+0

Огромное вам спасибо: D –

+0

Рад помочь :) – doru

ответ

2

Я сменил объект возврата в Flask от return messages к этой части кода.

Сначала я импортирован в from flask.json import jsonify

try: 
    response = gmail_service.users().messages().list(userId='me', q=query).execute() 
    messages = [] 
    if 'messages' in response: 
     print 'test %s' % response 
     messages.extend(response['messages']) 
    while 'nextPageToken' in response: 
     page_token = response['nextPageToken'] 
     response = gmail_service.users().messages().list(userId='me', q=query, pageToken=page_token).execute() 
     messages.extend(response['messages']) 

    return jsonify({'data': messages}) # changed here 
except errors.HttpError, error: 
    print 'An error occurred: %s' % error 

все заслуга @doru

Смежные вопросы