我正在将 Google Drive API 集成到我的 Django 项目中。 我的代码工作正常,但是当我尝试通过关闭浏览器而不通过登录来验证自己的身份或任何类型的中止结果冻结整个应用程序来中止身份验证时。
这是代码,
flow = InstalledAppFlow.from_client_secrets_file(settings.GOOGLE_OAUTH2_CLIENT_SECRETS_JSON, self.SCOPES,redirect_uri='show_courses')
creds = flow.run_local_server(port=0)
with open(token_path, 'w') as token_file:
token_file.write(creds.to_json())
如果用户在未经身份验证的情况下关闭浏览器,所有内容都会卡在这条线上
creds = flow.run_local_server(port=0)
请让我知道如何处理这种情况。过去几个月我一直在为此奋斗。
中止身份验证过程时应用程序冻结的原因是因为
flow.run_local_server()
方法被阻止。这意味着在用户通过身份验证或身份验证过程中止之前它不会返回。
当您中止身份验证过程时,
flow.run_local_server()
方法将引发HttpError
异常。此异常不会被您的代码捕获,因此它将在堆栈中传播并导致整个应用程序崩溃。
要解决此问题,您需要捕获
HttpError
异常并妥善处理。例如,您可以记录错误,然后将用户重定向到不同的页面。
这是处理
HttpError
异常的代码的更新版本:
flow = InstalledAppFlow.from_client_secrets_file(settings.GOOGLE_OAUTH2_CLIENT_SECRETS_JSON, self.SCOPES,redirect_uri='show_courses')
try:
creds = flow.run_local_server(port=0)
except HttpError as e:
logger.error('Error authenticating to Google Drive: %s', e)
return redirect('home')
with open(token_path, 'w') as token_file:
token_file.write(creds.to_json())
此更新版本的代码将记录错误,然后在身份验证过程中止时将用户重定向到主页。
除了处理
HttpError
异常之外,您还应该考虑使用非阻塞方法来验证用户身份。这将允许您在用户进行身份验证时继续处理其他请求。
实现此目的的一种方法是使用后台任务来验证用户身份。例如,您可以使用 Django Celery 库创建一个任务来对用户进行身份验证,然后将凭据保存到数据库中。任务完成后,您可以通知用户他们已成功通过身份验证。
实现此目的的另一种方法是使用 JavaScript 库在浏览器中对用户进行身份验证。例如,您可以使用 Google OAuth JavaScript 库对用户进行身份验证,然后使用凭据将其重定向回您的 Django 应用程序。