Google API Python客户端Flask示例的Django等效实现及OAuth适配问题
刚好我之前做过Django集成Google OAuth的需求,来帮你把Flask的示例转换成Django的等效实现,重点解决你关心的flask.session替换问题~
核心替换点:flask.session → request.session
在Django中,会话数据是通过**request.session**对象来存取的,用法和Flask的flask.session几乎一致——都是键值对的形式。所以Flask里的flask.session['credentials'],在Django里直接换成request.session['credentials']就可以了。
完整Django等效实现
下面是对应Flask示例的完整Django代码,包含路由配置、OAuth授权流程和API调用逻辑:
1. 先安装依赖包
和Flask一样,需要安装Google OAuth相关的Python库:
pip install google-auth google-auth-oauthlib google-auth-httplib2 google-api-python-client
2. 配置Django路由(urls.py)
在你的app的urls.py里添加对应的端点,对应Flask的路由:
from django.urls import path from . import views urlpatterns = [ path('test/', views.test_api_request, name='test_api'), path('authorize/', views.authorize, name='authorize'), path('oauth2callback/', views.oauth2callback, name='oauth2callback'), ]
3. 实现视图逻辑(views.py)
这部分是核心,对应Flask里的视图函数:
from django.shortcuts import redirect from django.http import HttpResponse import google.oauth2.credentials import google_auth_oauthlib.flow from googleapiclient.discovery import build # 替换成你的Google OAuth配置(和Flask示例里的配置一致) CLIENT_SECRETS_FILE = 'client_secret.json' SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'] REDIRECT_URI = 'http://localhost:8000/oauth2callback/' # 要和Google控制台配置的一致 def authorize(request): # 初始化OAuth授权流 flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( CLIENT_SECRETS_FILE, scopes=SCOPES) flow.redirect_uri = REDIRECT_URI # 生成授权URL和state,state用于回调时验证请求合法性 authorization_url, state = flow.authorization_url( access_type='offline', # 请求离线访问权限,用于刷新token include_granted_scopes='true') # 把state存入Django会话 request.session['state'] = state return redirect(authorization_url) def oauth2callback(request): # 从会话中取出之前存储的state state = request.session['state'] # 重新初始化流并验证state flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( CLIENT_SECRETS_FILE, scopes=SCOPES, state=state) flow.redirect_uri = REDIRECT_URI # 获取授权响应并交换token authorization_response = request.build_absolute_uri() flow.fetch_token(authorization_response=authorization_response) # 将凭证存入Django会话,对应Flask里的flask.session['credentials'] credentials = flow.credentials request.session['credentials'] = { 'token': credentials.token, 'refresh_token': credentials.refresh_token, 'token_uri': credentials.token_uri, 'client_id': credentials.client_id, 'client_secret': credentials.client_secret, 'scopes': credentials.scopes } # 授权完成后跳转到测试API页面 return redirect('test_api') def test_api_request(request): # 检查会话中是否存在凭证,对应Flask的'credentials' not in flask.session if 'credentials' not in request.session: return redirect('authorize') # 从会话加载凭证,替换Flask的google.oauth2.credentials.Credentials(**flask.session['credentials']) credentials = google.oauth2.credentials.Credentials( **request.session['credentials']) # 这里可以调用任意Google API,示例是获取Drive文件列表 service = build('drive', 'v3', credentials=credentials) results = service.files().list( pageSize=10, fields="nextPageToken, files(id, name)").execute() items = results.get('files', []) if not items: return HttpResponse('No files found.') else: output = 'Files:<br>' for item in items: output += f'{item["name"]} ({item["id"]})<br>' return HttpResponse(output)
额外注意事项
- 会话安全:生产环境下要确保Django的
SESSION_COOKIE_SECURE设置为True,避免会话数据被明文传输。 - 凭证过期处理:可以在使用凭证前检查是否过期,调用
credentials.refresh(request)来自动刷新token(需要确保有refresh_token)。 - 秘钥文件安全:
client_secret.json要放在Django项目的安全目录,不要提交到版本控制系统。
内容的提问来源于stack exchange,提问作者Jay Jung
相关产品推荐
相关产品推荐

