Аутентификация в Google Sheets истекает каждые несколько часов - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время я использую gspread для постоянного доступа к документу Google Sheets на веб-сервере.

Он размещен на веб-сервере Flask (apache WSGI), поэтому подключение к Google должно быть непрерывным и постоянно проходить проверку подлинности.

У меня возникла проблема, из-за которой через несколько часов мне нужно будет восстановить объект книги (выполнить повторную проверку подлинности), или я получу эту проблему (см. Ниже).

Ниже приведено то, что я сделал, чтобы попытаться решить проблему, но я все еще сталкиваюсь с той же проблемой и хотел бы знать, есть ли у вас какие-либо идеи.

Существует 5-6 разных листов, и я создаю класс с разными методами доступа к каждому листу (все наследуются от Access).

book = authorise()
employee, shift, clock, client, payment = Employee(book), Shift(book), 
Clock(book), Client(book), Payment(book)

def refresh_google_access(self): #CALLED EVERY 40 MINUTES
   book = authorise()
   employee._refresh(book)
   shift._refresh(book)
   clock._refresh(book)
   client._refresh(book)
   payment._refresh(book)

def authorise():
   scope = ['https://spreadsheets.google.com/feeds']
   credentials = ServiceAccountCredentials.from_json_keyfile_name('clocker/access.json', scope)
   gc = gspread.authorize(credentials)
   book = gc.open_by_key(SHEET_KEY)

   return book

class Access:
   def _refresh(self, book):
       self.__init__(book)

class Employee(Access):

   def __init__(self, book):
       self.sheet = book.worksheet("Employee List")

   ...

class Clock(Access):

   def __init__(self, book):
       self.sheet = book.worksheet("Time Log")

   ...

class Shift(Access):

   def __init__(self, book):
       self.sheet = book.worksheet("Shift List")
   ...

class Client(Access):

   def __init__(self, book):
       self.sheet = book.worksheet("Client List")

   ...

class Payment(Access):

   def __init__(self, book):
       self.sheet = book.worksheet("Payments")

   ...

Через несколько часов (где-то между 4-24 часами) я получу эту ошибку:

Traceback (most recent call last):
   File "/home/ve/lib/python3.4/site-packages/flask/app.py", line 2292, in wsgi_app
     response = self.full_dispatch_request()
   File "/home/ve/lib/python3.4/site-packages/flask/app.py", line 1815, in full_dispatch_request
     rv = self.handle_user_exception(e)
   File "/home/ve/lib/python3.4/site-packages/flask/app.py", line 1718, in handle_user_exception
     reraise(exc_type, exc_value, tb)
   File "/home/ve/lib/python3.4/site-packages/flask/_compat.py", line 35, in reraise
     raise value
   File "/home/ve/lib/python3.4/site-packages/flask/app.py", line 1813, in full_dispatch_request
     rv = self.dispatch_request()
   File "/home/ve/lib/python3.4/site-packages/flask/app.py", line 1799, in dispatch_request
     return self.view_functions[rule.endpoint](**req.view_args)
   File "/var/www/clocker/clocker/routes.py", line 43, in voice
     clocked_in = clock.is_clocked_in(id)
   File "/var/www/clocker/clocker/sheet_access.py", line 115, in is_clocked_in
     latest_clock_in = self.get_latest_clock_in(id)
   File "/var/www/clocker/clocker/sheet_access.py", line 107, in get_latest_clock_in
     result = self.sheet.findall(str(id))
   File "/home/ve/lib/python3.4/site-packages/gspread/models.py", line 814, in findall
     return list(self._finder(filter, query))
   File "/home/ve/lib/python3.4/site-packages/gspread/models.py", line 779, in _finder
     data = self.spreadsheet.values_get(self.title)
   File "/home/ve/lib/python3.4/site-packages/gspread/models.py", line 110, in values_get
     r = self.client.request('get', url, params=params)
   File "/home/ve/lib/python3.4/site-packages/gspread/client.py", line 79, in request
     raise APIError(response)
 gspread.exceptions.APIError: {
   "error": {
     "code": 401,
     "message": "Request had invalid authentication credentials. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
     "status": "UNAUTHENTICATED"
   }
 }

Это можно исправить почти каждый раз, просто перезапустив сервер.

Восстановление объекта книги, похоже, не решает проблему, я проверил, что id книги меняется каждые 40 минут.

1 Ответ

0 голосов
/ 07 сентября 2018

Если я правильно понимаю, при моем использовании я бы держался за gc и звонил бы book = gc.open_by_key(SHEET_KEY), когда вам нужны данные.

По сути, вместо сохранения book в качестве глобальной переменной сохраните gc, чтобы сохранить ранее проверенный сеанс и использовать его для дальнейших запросов.

...