You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:14:51