title: Zoho CRM Python SDK v2 initialization problem for Django
body: <p>Im trying to integrate the Zoho CRM v2 SDK with my Django app.
  On the Django runserver, im able to get access tokens and using the refresh method and store them in the zcrm_oauthtokens.pkl file.  The sdk then automatically refreshes the access token using the refresh token, so no problem here.  However on my production server (heroku) im getting this error message:</p>
  <pre><code>2019-01-16T11:07:22.314759+00:00 app[web.1]: 2019-01-16 11:07:22,314    - Client_Library_OAUTH - ERROR - Exception occured while fetching oauthtoken from db; Exception Message::'NoneType' object has no attribute 'accessToken'
  </code></pre>
  <p>It seems to me that the tokens are being saved to file, but when the sdk try to access them it is looking for them in a DB and not the file specified in the token_persistence_path.</p>
  <p>In my settings.py I have this:</p>
  <pre><code>ZOHO_CLIENT_ID = config('ZOHO_CLIENT_ID')
  ZOHO_CLIENT_SECRET = config('ZOHO_CLIENT_SECRET')
  ZOHO_REDIRECT_URI = config('ZOHO_REDIRECT_URI')
  ZOHO_CURRENT_USER_EMAIL = 'jamesalexander@mylastwill.co.uk'
  ZOHO_PATH = os.path.join(BASE_DIR, 'wills_online', 'zoho')
  
  zoho_config = {'apiBaseUrl': &quot;https://www.zohoapis.com&quot;,
                 'currentUserEmail': ZOHO_CURRENT_USER_EMAIL,
                 'client_id': ZOHO_CLIENT_ID,
                 'client_secret': ZOHO_CLIENT_SECRET,
                 'redirect_uri': ZOHO_REDIRECT_URI,
                 'token_persistence_path': ZOHO_PATH}
  </code></pre>
  <p>and in a views file I have this:</p>
  <pre><code>from zcrmsdk import *
  import logging
  from django.shortcuts import HttpResponse
  from wills.models import PersonalDetails, ZoHoRecord, WillDocument
  from wills_online.decorators import start_new_thread
  from wills_online.settings import zoho_config
  logger = logging.getLogger(__name__)
  
  
  class ZohoRunOnce:
      def __init__(self):
          self.already_run = False
  
      def run_once(self):
          if not self.already_run:
              print('zoho init run once')
              ZCRMRestClient.initialize(zoho_config)
              self.already_run = True
  
  zoho_init = ZohoRunOnce()
  zoho_init.run_once()
  print(zoho_config['token_persistence_path'])
  
  
  def zoho_callback():
      return HttpResponse(200)
  
  @start_new_thread
  def zoho_personal_details(request):
      &quot;&quot;&quot; updates or create a user account on zoho on profile completion &quot;&quot;&quot;
  
      personal_details_ob = PersonalDetails.objects.get(user=request.user)
      zoho_ob = ZoHoRecord.objects.get(user=request.user)
  
      try:
          if zoho_ob.account:
              record = ZCRMRecord.get_instance('Accounts', zoho_ob.account)
              record.set_field_value('Account_Name', request.user.email)
              record.set_field_value('Name', personal_details_ob.full_name)
              record.set_field_value('Email', request.user.email)
              record.set_field_value('Address_Line_1', personal_details_ob.address_line_1)
              record.set_field_value('Address_Line_2', personal_details_ob.address_line_2)
              record.set_field_value('Post_Town', personal_details_ob.post_town)
              record.set_field_value('Post_Code', personal_details_ob.post_code)
              record.set_field_value('Dob_Day', personal_details_ob.dob_day)
              record.set_field_value('Dob_Month', personal_details_ob.dob_month)
              record.set_field_value('Dob_Year', personal_details_ob.dob_year)
              record.set_field_value('Gender', personal_details_ob.sex)
              record.set_field_value('Marital_Status', personal_details_ob.marital_status)
              record.set_field_value('Partner_Name', personal_details_ob.partner_full_name)
              record.set_field_value('Partner_Gender', personal_details_ob.partner_gender)
              record.set_field_value('Partner_Email', personal_details_ob.partner_email)
              record.set_field_value('Children', personal_details_ob.children)
              record.set_field_value('Pets', personal_details_ob.pets)
              record.update()
          else:
              user = ZCRMUser.get_instance(name='James Alexander')
              record = ZCRMRecord.get_instance('Accounts')
              record.set_field_value('Account_Owner', user)
              record.set_field_value('Account_Name', request.user.email)
              record.set_field_value('Name', personal_details_ob.full_name)
              record.set_field_value('Email', request.user.email)
              record.set_field_value('Address_Line_1', personal_details_ob.address_line_1)
              record.set_field_value('Address_Line_2', personal_details_ob.address_line_2)
              record.set_field_value('Post_Town', personal_details_ob.post_town)
              record.set_field_value('Post_Code', personal_details_ob.post_code)
              record.set_field_value('Dob_Day', personal_details_ob.dob_day)
              record.set_field_value('Dob_Month', personal_details_ob.dob_month)
              record.set_field_value('Dob_Year', personal_details_ob.dob_year)
              record.set_field_value('Gender', personal_details_ob.sex)
              record.set_field_value('Marital_Status', personal_details_ob.marital_status)
              record.set_field_value('Partner_Name', personal_details_ob.partner_full_name)
              record.set_field_value('Partner_Gender', personal_details_ob.partner_gender)
              record.set_field_value('Partner_Email', personal_details_ob.partner_email)
              record.set_field_value('Children', personal_details_ob.children)
              record.set_field_value('Pets', personal_details_ob.pets)
              response = record.create()
              # save account id to db for future updates
              zoho_ob.account = response.details['id']
              zoho_ob.save()
  
      except ZCRMException as ex:
          logger.log(1, ex.status_code)
          logger.log(1, ex.error_message)
          logger.log(1, ex.error_details)
          logger.log(1, ex.error_content)
          print(ex.status_code)
          print(ex.error_message)
          print(ex.error_content)
          print(ex.error_details)
  </code></pre>
  <p>Ive tried running  ZCRMRestClient.initialize(zoho_config) in settings.py, with no luck.</p>
  <p>My method for getting the access token and refresh token, which seems to work is:</p>
  <pre><code>import os
  import pprint
  from sys import argv
  
  import django
  import requests
  import zcrmsdk
  from django.conf import settings
  
  os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'wills_online.settings')
  django.setup()
  
  
  def zoho_refresh_token(code):
      &quot;&quot;&quot; supply a self client token from the zoho api credentials from web site &quot;&quot;&quot;
  
      zoho_config = {&quot;apiBaseUrl&quot;: &quot;https://www.zohoapis.com&quot;,
                 &quot;currentUserEmail&quot;: settings.ZOHO_CURRENT_USER_EMAIL,
                 &quot;client_id&quot;: settings.ZOHO_CLIENT_ID,
                 &quot;client_secret&quot;: settings.ZOHO_CLIENT_SECRET,
                 &quot;redirect_uri&quot;: settings.ZOHO_REDIRECT_URI,
                 &quot;token_persistence_path&quot;: settings.ZOHO_PATH}
  
  pprint.pprint(zoho_config)
  
  print('working')
  address = f'https://accounts.zoho.com/oauth/v2/token?code={code}&amp;redirect_uri={settings.ZOHO_REDIRECT_URI}&amp;client_id={settings.ZOHO_CLIENT_ID}&amp;client_secret={settings.ZOHO_CLIENT_SECRET}&amp;grant_type=authorization_code'
  response = requests.post(address)
  data = response.json()
  pprint.pprint(data)
  zcrmsdk.ZCRMRestClient.initialize(zoho_config)
  oauth_client = zcrmsdk.ZohoOAuth.get_client_instance()
  refresh_token = data['refresh_token']
  print(type(refresh_token))
  oauth_client.generate_access_token_from_refresh_token(refresh_token, settings.ZOHO_CURRENT_USER_EMAIL)
  
  print(refresh_token)
  print('finished')
  </code></pre>
  <p>if <strong>name</strong> == '<strong>main</strong>':
  zoho_refresh_token(argv[1])</p>
  <p>This is driving me mad.  Help would be greatly appreciated.  This is my first post so go easy, lol.</p>