В настоящее время я использую 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 минут.